我有一个包含两列的表格:
我需要选择所有合作对,这很简单,但问题是什么:
表格包含以下数据:987
- 102
,103 - 104
,104 - 103
,21 - 102
。
如果有这样的数据,我应该有3个合作对987 - 102
,103-104
,21-102
,如您所见,103 - 104
和104 - 103
记录具有相同的逻辑,我怎样才能避免重复它们。有什么想法吗?
谢谢,最诚挚的问候。安东。
答案 0 :(得分:10)
您可以使用MySQL的LEAST()
和GREATEST()
函数以及DISTINCT
:
SELECT DISTINCT LEAST(a, b), GREATEST(a, b) FROM mytable
答案 1 :(得分:3)
如果保留每个“对”中元素的顺序不重要,请参阅eggyal的答案。该查询返回的结果集与您指定的结果集稍有不同,它返回对102-987
而不是987-102
。它还消除了表中出现的任何“重复”对。
如果保留每对中元素的顺序很重要,并且当这些“匹配”对都是“匹配”对时,您希望返回“更小 - 更大”而不是“更大 - 更小”现在,你可以使用这样的东西:
SELECT c.col1, c.col2
FROM mytable c
LEFT
JOIN mytable d ON d.col1 = c.col2 AND d.col2 = c.col1 AND d.col1 <> d.col2
WHERE (d.col1 IS NULL OR d.col1 > c.col1)
要消除所有重复对和“匹配”对,请添加GROUP BY子句或DISTINCT关键字,例如
SELECT c.col1, c.col2
FROM mytable c
LEFT
JOIN mytable d ON d.col1 = c.col2 AND d.col2 = c.col1 AND d.col1 <> d.col2
WHERE (d.col1 IS NULL OR d.col1 > c.col1)
GROUP BY c.col1, c.col2
说明:
SQL小提琴:http://sqlfiddle.com/#!2/1d9e7/1和此处:http://sqlfiddle.com/#!2/1d9e7/2
比较运算符不是空安全的,当col1或col2包含NULL值时,它们可能不会返回所需的结果集。 (可以修改查询以处理col1和/或col2的NULL值。)如上所述,如果那些“匹配”“对”是,则两个查询都将返回(1,NULL)
和(NULL,1)
两者。在表中。 (归结为是否要考虑NULL值是否匹配的问题。)
另请注意,两个查询都会返回col1=col2
的行。
请注意,第一个查询不会消除表中存在的“重复”行。也就是说,如果重复的“对”例如(202,101)
出现在两个不同的行中,则两者都将被返回(除非查询返回至少一行带有“匹配”对的行:(101,202)
。)< / p>
在这些情况下,您想要返回的结果集尚不清楚,因此第一个查询显示当匹配的(larger,smaller)
对位于结果集中时,仅消除行(smaller,larger)
的模式。
第二个查询消除了所有重复和“匹配”对。