MySQL在多列中查找重复项

时间:2015-04-22 15:57:47

标签: mysql

我有一个表,用户ID分为2列。 (为了解释这一点,我们通过扫描条形码来捕获参与者的ID。有时条形码扫描器功能因任何原因都不起作用,因此我们还允许手动输入ID,如果条形码扫描器不起作用。这导致如下数据:

+------+-----------+
|  ID  | ID_MANUAL |
+------+-----------+
| A    | NULL      |  
| NULL | A         |  
| B    | NULL      |  
| B    | NULL      |  
| NULL | C         |  
| C    | NULL      |  
| NULL | D         |  
| NULL | D         |  
+------+-----------+

我想找到所有重复的ID,同时考虑两列。很容易找到仅在1列(“B”和“D”)中的重复项。但是如何找到重复的“A”和“C”?理想情况下,查询将查找并返回所有重复项(A,B,C和D)。

谢谢!

5 个答案:

答案 0 :(得分:1)

试试这个:

SELECT DUP.* FROM (SELECT ID FROM yourtable) ORI
LEFT JOIN yourtable DUP ON DUP.ID = ORI.ID_MANUAL WHERE DUP.ID IS NOT NULL 

答案 1 :(得分:0)

建议:名为ID m的字段,唯一且不为空。但是如果你有这个结构,你可以试试这个:

SELECT id
FROM yourtable t
WHERE id is not null
AND
    (SELECT COUNT(*)
    FROM yourtable t2
    WHERE t2.id = t.id) +
    (SELECT COUNT(*)
    FROM yourtable t3
    WHERE t3.id_manual = t.id) > 1

UNION

SELECT id_manual
FROM yourtable t
WHERE id_manual is not null
AND
    (SELECT COUNT(*)
    FROM yourtable t2
    WHERE t2.id = t.id_manual) +
    (SELECT COUNT(*)
    FROM yourtable t3
    WHERE t3.id_manual = t.id_manual) > 1

您可以继续Sql Fiddle

答案 2 :(得分:0)

你可以在这里试试UNION ALL

select id,count(*)
from
(
 select id
 from yourtable
 union all
 select id_manual as id
 from yourtable
) a
group by id
having count(*) >1;

答案 3 :(得分:0)

尝试:

select id, count(*)
from
(
 select id
 from data
 where id_manual is null
 union all
 select id_manual as id
 from data
 where id is null
) a
group by id
having count(*) > 1;

select id, id_manual
from data
group by id, id_manual
having count(*) > 1;

答案 4 :(得分:0)

如果您有代理自动增量主键,可以使用COALESCE和DISTINCT通过简单的JOIN执行此操作:

SELECT DISTINCT s2.pk, s2.ID, s2.ID_MANUAL
FROM scans s1
JOIN scans s2
ON COALESCE(s2.ID, s2.ID_MANUAL) = COALESCE(s1.ID, s1.ID_MANUAL)
AND s2.pk > s1.pk

这将排除原始记录,因此您可以删除此结果集中返回的记录。

这是SQL Fiddle