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
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:如果可以的话,我会再次投票支持你的答案,因为这是返回一组不同的“对”的最优雅的方法。