[英]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 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 |
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.