【问题标题】:Get list of duplicate rows in MySql获取MySql中重复行的列表
【发布时间】:2010-05-21 11:54:46
【问题描述】:

我有一张这样的桌子

ID     nachname     vorname
1       john         doe
2       john         doe
3       jim          doe
4       Michael     Knight

我需要一个查询,该查询将返回具有相同 nachname 和 vorname 的记录(在本例中为记录 1 和 2)中的所有字段(选择 *)。 谁能帮我这个?谢谢

【问题讨论】:

    标签: sql mysql


    【解决方案1】:

    以下查询将给出重复列表:

    SELECT n1.* FROM table n1
    inner join table n2 on n2.vorname=n1.vorname and n2.nachname=n1.nachname
    where n1.id <> n2.id
    

    顺便说一句,您发布的数据似乎是错误的“Doe”和“Knight”是姓氏,而不是名字:p。

    【讨论】:

    • 我只需要添加 select distinct(查询返回同一行的 2 次)。感谢您的帮助
    • 注意:如果字段“vorname”和“nachname”可以为空,那么应该使用“coalesce”函数进行比较。见:stackoverflow.com/questions/9608639/…
    【解决方案2】:

    您的问题的一般解决方案是表单查询

    SELECT col1, col2, count(*)
    FROM t1
    GROUP BY col1, col2
    HAVING count(*) > 1
    

    这将为表中的每组重复行返回一行。此结果中的最后一列是特定值的重复数。


    如果您真的想要 ID,请尝试以下操作:

    SELECT id FROM 
    t1, 
    ( SELECT col1, col2, count(*)
      FROM t1
      GROUP BY col1, col2
      HAVING count(*) > 1 ) as t2
    WHERE t1.col1 = t2.col1 AND t1.col2 = t2.col2 
    

    还没有测试过

    【讨论】:

    • 这实际上不会返回所有行,它只会找到重复的行。
    • 这是一种昂贵的方式,您可以使用简单的连接来解决它(请参阅我的答案:p)。
    【解决方案3】:

    您可以通过自加入来做到这一点:

    select distinct t1.id from t as t1 inner join t as t2 
    on t1.col1=t2.col1 and t1.col2=t2.col2 and t1.id<>t2.id
    

    t1.id&lt;&gt;t2.id 是避免 id 与自己匹配的必要条件。 (如果每组重复项中只需要 1 行,可以使用t1.id&lt;t2.id)。

    【讨论】:

    • 不,那只会返回 1 行,其中包含 2 条匹配记录,而不是它应该返回的 2 行...
    • @wimvds true,如果你想要所有重复的行(而不是每个重复集的 1 行,你应该使用 )
    【解决方案4】:
    select * from table AS t1 inner join
    (select max(id) As id,nachname,vorname, count(*) 
    from t1 group by nachname,vorname 
    having count(*) >1) AS t2 on t1.id=t2.id
    

    这应该返回表中存在重复 nachname 和 vorname 的所有列。我建议将 * 更改为您需要的确切列。

    编辑:我添加了一个 max(id),这样 group by 就不会成为问题。我的查询并不像我想要的那样优雅。可能有更简单的方法。

    【讨论】:

    • 嗯...我明白你的意思了。但我很确定你的查询是错误的。如果您不使用id,则无法返回group by
    • 该连接不起作用 - t2 查询中没有 id 列。
    • 这完全是错误的...如果您使用 MySQL,group by 实际上会消除您拥有的任何重复项,因为您只对 nachname 和 vorname 进行分组,因此它将返回 1 行,其中1 个 ID,而不是您可能期望的所有不同的行(只需尝试一下,您就会看到)。哦,任何其他 RDBMS 都会抱怨你的 group by(这是唯一正确的方法,我讨厌 MySQL 试图猜测你想要什么并执行这些错误的查询而不是抛出错误)。
    猜你喜欢
    • 2016-04-26
    • 2015-03-21
    • 1970-01-01
    • 2021-08-08
    • 1970-01-01
    • 1970-01-01
    • 2020-12-08
    • 2013-07-04
    • 2018-06-04
    相关资源
    最近更新 更多