2017-10-16 64 views
1

我想通过一张拥有数千条记录的表格进行筛选,并且需要获得真正的重复行。通过真我的意思是所有列是相同的记录。MySQL,获取真实重复记录

我使用像这样的时刻,但它显然只是找到COLUMN_1重复:

SELECT * FROM `table` 
    WHERE `column_1` IN (
     SELECT `column_1` FROM `table` 
     GROUP BY `column_1`, `column_2`, `column_3` 
     HAVING COUNT(id) > 1 
    ) 

我怎么会写这样获得与被复制的所有列排除的ID重复的行? 没有列出表格中的所有列?

+0

在MySQL中,我认为你必须列出所有的列。 –

回答

1

,这很容易使您的查询工作,为所有列,假设无有NULL值:

SELECT t.* 
FROM `table` t 
WHERE (`column_1`, `column_2`, `column_3`) IN (
     SELECT `column_1`, `column_2`, `column_3` 
     FROM `table` t2 
     GROUP BY `column_1`, `column_2`, `column_3` 
     HAVING COUNT(id) > 1 
    ); 

如果你有NULL值,那么你要NULL安全比较:

SELECT t.* 
FROM `table` t JOIN 
     (SELECT `column_1`, `column_2`, `column_3` 
     FROM `table` t2 
     GROUP BY `column_1`, `column_2`, `column_3` 
     HAVING COUNT(id) > 1 
    ) tt 
     ON (NOT tt.column_1 <=> t.column_1) AND 
     (NOT tt.column_2 <=> t.column_2) AND 
     (NOT tt.column_3 <=> t.column_3); 

当然,这远离简单的目标。

为什么你需要看到每个重复是好奇。为什么不这样做:

 SELECT `column_1`, `column_2`, `column_3`, COUNT(*) 
     FROM `table` t2 
     GROUP BY `column_1`, `column_2`, `column_3` 
     HAVING COUNT(id) > 1 

尽管在这两种情况下,您都需要列出所有列(至少一次)。否则,我认为在MySQL中没有办法做到这一点。有些数据库允许您为整行创建一个JSON对象或XML对象 - 使其成为可能而不列出所有列。我想不出任何类似于MySQL的东西。

+0

我玩过这个确切的想法,,,这不是我所需要的。一些肯定有空值。我没有显示所有列的问题,我检索绝对副本时遇到问题。我需要看到它们,因为它们必须可用于客户端的视觉概览。你可能是对的,但我必须至少列出一次:) – GRowing

+0

谢谢你。经过一些修改后,它会正常工作 – GRowing