Mysql选择互惠的记录对,没有重复

时间:2012-07-02 17:55:37

标签: mysql select

我有一个包含两列的表格:

  1. 为person_id
  2. 与第一场ID合作的person_id
  3. 我需要选择所有合作对,这很简单,但问题是什么: 表格包含以下数据:987 - 102103 - 104104 - 10321 - 102。 如果有这样的数据,我应该有3个合作对987 - 102103-10421-102,如您所见,103 - 104104 - 103记录具有相同的逻辑,我怎样才能避免重复它们。有什么想法吗?

    谢谢,最诚挚的问候。安东。

2 个答案:

答案 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)的模式。

第二个查询消除了所有重复和“匹配”对。