简体   繁体   English

显示不同的元组,与列顺序无关

[英]Show distinct tuples regardless of column order

Say I have following results 说我有以下结果

----------------------
|   col1  |   col2   |
----------------------
|    a    |    b     |
|    b    |    a     |
|    c    |    d     |
|    e    |    f     |
----------------------

I would like to get distinct tuple regardless of column order. 无论列顺序如何,我都希望获得独特的元组。 In other words, (a, b) and (b, a) are considered "same" because changing the order make one same as the other (a, b) == (a, b). 换句话说,(a,b)和(b,a)被认为是“相同”的,因为更改顺序使另一个(a,b)==(a,b)相同。 So, after executing query should be: 因此,执行查询后应该是:

----------------------
|   col1  |   col2   |
----------------------
|    a    |    b     | // or (b, a)
|    c    |    d     |
|    e    |    f     |
----------------------

Can any query expert help me on this? 任何查询专家都可以帮助我吗? I've been stuck for few hours and wasn't able to solve this. 我被困了几个小时,无法解决这个问题。

Below is my detailed scenario I'm working on. 以下是我正在研究的详细方案。

I have the following relations: 我有以下关系:

Ships(name, country) // ("Lincoln", "USA") = "Ship Lincoln belongs to USA"
Battles(ship, battleName) // ("Lincoln", "WW2") = "Ship Lincoln fought in WW2"

And I need to find: List all pairs of countries that fought each other in battles 我需要找到: 列出在战斗中互相作战的所有成对国家

I was able to find all pairs by executing below query: 我可以通过执行以下查询找到所有对:

 SELECT DISTINCT c1, c2
 FROM
 (SELECT DISTINCT s1.country as c1, battleName as b1
  FROM Ships as s1, Battles
  WHERE s1.name = ship) as t1
 JOIN
 (SELECT DISTINCT s2.country as c2, battleName as b2
  FROM Ships as s2, Battles
  WHERE s2.name = ship) as t2
 ON (b1 = b2)
 WHERE c1 <> c2

And the result of executing above query is: 执行上述查询的结果是:

---------------------------------
|       c1      |       c2      |
---------------------------------
|       USA     |     Japan     |   // Row_1
|      Japan    |      USA      |   // Row_2
|     Germany   | Great Britain |   // Row_3
| Great Britain |    Germany    |   // Row_4
---------------------------------

But Row_1 and Row_2 are same as well as Row_3 and Row_4. 但是Row_1和Row_2以及Row_3和Row_4相同。

What I need is to print either one of Row_1 or Row_2 and either Row_3 or Row_4. 我需要打印Row_1或Row_2之一,以及Row_3或Row_4。

Thank you 谢谢

Try it this way 这样尝试

SELECT DISTINCT
       LEAST(s1.country, s2.country) c1,
       GREATEST(s1.country, s2.country) c2
  FROM battles b1 JOIN battles b2
    ON b1.battlename = b2.battlename
   AND b1.ship <> b2.ship JOIN ships s1
    ON b1.ship = s1.name JOIN ships s2
    ON b2.ship = s2.name
HAVING c1 <> c2

Output: 输出:

|      C1 |            C2 |
|---------|---------------|
| Germany | Great Britain |
|   Japan |           USA |

Here is SQLFiddle demo 这是SQLFiddle演示

Here is how you can do it 这是你怎么做

Sample data 样本数据

| COL1 | COL2 |
|------|------|
|    a |    b |
|    b |    a |
|    c |    d |
|    e |    f |

Query 询问

SELECT
  k.*
FROM test k
  LEFT JOIN (SELECT
               t.col1
             FROM test t
               INNER JOIN test r
                 ON (r.col1 = t.col2
                     AND t.col1 = r.col2)
             LIMIT 1) b
    ON b.col1 = k.col1
WHERE b.col1 IS NULL

OUTPUT OUTPUT

| COL1 | COL2 |
|------|------|
|    a |    b |
|    c |    d |
|    e |    f |

SQL Fiddle Demo SQL小提琴演示

That's an interesting question, looks simple but is tricky. 这是一个有趣的问题,看起来很简单但是很棘手。 I have tried it on SQL Server. 我已经在SQL Server上尝试过。 Here is my query, assuming input table 'test' contains distinct rows: 这是我的查询,假设输入表“ test”包含不同的行:

| COL1 | COL2 |
|------|------|
|    a |    b |
|    b |    a |
|    c |    d |
|    a |    e |

SELECT t1.col1, t1.col2
FROM test t1
EXCEPT
SELECT t1.col1, t1.col2
FROM test t1
INNER JOIN test t2
ON t1.col1 = t2.col2 AND t1.col2 = t2.col1
AND t1.col1 > t1.col2  

Please replace it with analogous MySQL query if it does not work verbatim. 如果它不能逐字记录,请用类似的MySQL查询替换它。 Let me know if this worked for you. 让我知道这是否对您有用。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM