Mysql选择对等记录对,不重复

Mysql选择对等记录对,不重复,mysql,select,Mysql,Select,我有一个包含两列的表: 个人识别码 与第一个字段id合作的人员\u id 我需要选择所有合作对,这很容易,但问题是什么: 表中有如下数据:987-102,103-104,104-103,21-102。 由于这样的数据,我应该有3个合作对987-102,103-104,21-102,正如您看到的103-104和104-103记录具有相同的逻辑,我如何避免重复它们。有什么想法吗 谢谢,并致以最良好的问候。Anton.您可以使用MySQL的和函数,以及DISTINCT: SELECT DISTINCT

我有一个包含两列的表:

  • 个人识别码
  • 与第一个字段id合作的人员\u id
  • 我需要选择所有合作对,这很容易,但问题是什么: 表中有如下数据:
    987
    -
    102
    103-104
    104-103
    21-102
    。 由于这样的数据,我应该有3个合作对
    987-102
    103-104
    21-102
    ,正如您看到的
    103-104
    104-103
    记录具有相同的逻辑,我如何避免重复它们。有什么想法吗

    谢谢,并致以最良好的问候。Anton.

    您可以使用MySQL的和函数,以及
    DISTINCT

    SELECT DISTINCT LEAST(a, b), GREATEST(a, b) FROM mytable
    

    如果保持每个“对”中元素的顺序并不重要,请参见eggyal的答案。该查询返回的结果集与您指定的结果集略有不同,它返回的是pair
    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)
    
    选择c.col1、c.col2
    从我的表c
    左边
    在d.col1=c.col2和d.col2=c.col1和d.col1 d.col2上连接mytable d
    其中(d.col1为NULL或d.col1>c.col1)
    
    要消除所有重复对和“匹配”对,请添加GROUPBY子句或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
    
    选择c.col1、c.col2
    从我的表c
    左边
    在d.col1=c.col2和d.col2=c.col1和d.col1 d.col2上连接mytable d
    其中(d.col1为NULL或d.col1>c.col1)
    按c.col1、c.col2分组
    
    注:

    SQL Fiddle here:和here:

    比较运算符不是空安全的,当col1或col2包含空值时,它们可能不会返回所需的结果集。(可以修改查询以处理col1和/或col2的空值。)如前所述,如果表中有那些“匹配”对,则这两个查询都将返回,例如
    (1,NULL)
    (NULL,1)
    。(这归结为是否要考虑NULL值匹配的问题)

    还要注意,两个查询都将返回
    col1=col2
    的行

    注意,第一个查询不会消除表中存在的“重复”行。也就是说,如果重复的“对”(例如
    (202101)
    )出现在两个不同的行中,则将返回这两个行(除非查询返回至少一行带有“匹配”对:
    (101202)

    在这些情况下,您不清楚希望返回什么结果集,因此第一个查询显示了当结果集中存在匹配的
    (较小,较大)
    对时,仅删除行
    (较大,较小)
    的模式


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

    PERSON\u ID int(10),QUESTION\u ID int(10)TEXT\u Response TEXT,我认为第二列不需要,因为在这个问题中,我在WHERE子句中使用它,如果您只有这对
    (2,1)
    ,它将作为
    (1,2)输出
    @alfasin:问题描述表明它们是等效的。否则,OP应澄清如何决定应保留和丢弃
    (103104)
    (104103)
    中的哪一个。@eggyall:你是对的,没有说明如何确定应返回
    (103104)
    ,而不是
    (104103)
    。但在某些情况下,保持其他“对”中元素的顺序可能很重要。例如,如果此结果集(子查询)再次联接到表,则从该行获取其他列。归根结底,元素对中元素的顺序可能很重要(我们没有被告知这一点)。规范给出了一个示例resultset。您的查询返回一个与规范不同的结果集。@spencer7593:您说得很对,但虽然OP没有明确说明,但我对所述问题的理解仍然是
    (a,b)=(b,a)
    ,所有这类对都不应返回一次。如果不是这样,那么你提出的答案是一个很好的建议。@eggyal:如果可以的话,我会再次投票支持你的答案,因为这是返回一组不同的“对”的最优雅的方法。