【问题标题】:Find duplicates where entries within id are duplicate查找 id 中的条目重复的重复项
【发布时间】:2018-03-06 08:46:00
【问题描述】:
id  class   count   day
 1    2       5      5
 2    2       4      5
 3    2       4      5
 3    2       4      5
 4    2       5      3
 4    1       5      3
 4    2       5      3

所以我有一个查询来查找基于多列的所有重复项,但是,这也会返回 id,其中并非所有条目都是重复的。 在上面的示例中,查询应该只显示/计算 id 3,因为所有 id 为 3 的条目都是重复的。尽管 id 4 也有重复项,但它不应该显示,因为它有另一个唯一的条目。

知道怎么做吗?

【问题讨论】:

  • 同时指定预期结果(如表格)。并向我们​​展示您当前的查询尝试。
  • 我们很高兴收到您的反馈 ;)

标签: mysql sql


【解决方案1】:

如果您需要带有id 的行,其中没有具有相同id 和唯一行值的行,则使用NOT IN 和HAVING

select *
from your_table t1
where t1.id not in(
  select id
  from your_table
  group by id, class, count, day
  having count(*) = 1
)

【讨论】:

  • 谢谢,这个做了我想要的。 :)
【解决方案2】:

您可以使用此查询:http://sqlfiddle.com/#!9/1a2536/8

select id
from test
group by id 
having count(distinct id,class,count,day) = 1 and count(*)>1

您按 id 对每一行进行分组,并计算该组有多少不同的行,如果不同的总数为 1 且总行数 > 1 ,则此 id 只有重复的行。

【讨论】:

    【解决方案3】:

    这很容易,快速说明命名列数是一个非常糟糕的主意:

        SELECT id, class, `count`,day, COUNT(*)
        FROM myTable
        GROUP BY id, class, `count`,day
        HAVING COUNT(*) > 1
    

    编辑:我误读了这个问题,所以这是我的解决方案:

    SELECT test.id, test.class, test.count, test.day , count(*), t.countID
    FROM (SELECT id, Count(id) AS countID FROM test GROUP BY id ) t
    INNER JOIN test on t.id = test.id
    GROUP BY test.id, test.class, test.count, test.day
    HAVING Count(*) > 1 AND t.countID = count(*)
    

    【讨论】:

    • 此查询返回 id 4 且没有完全重复的行
    • 我已经编辑了我的查询,如果你想要的话,请告诉我们
    【解决方案4】:

    我想出了这个:

    SELECT *
    FROM   (SELECT id,
                   Count(id) AS matched
            FROM   test
            GROUP  BY id,
                      class,
                      count,
                      day) t
    GROUP  BY id , matched
    HAVING Count(id) = 1
           AND matched >= 2 
    

    也许有一种更有效的方法,但这种方法更容易理解,首先我们按每一列分组以查找重复数据。然后,第一部分通过 id 消除实际上具有不同变体的条目,然后我们只保留实际上只有重复的行。

    编辑:兼容“only_full_group_by”模式

    【讨论】:

    • 这个答案很有效,我是第一个给出答案的,尽管它可能不是最佳答案,但我认为它不值得一票否决……这不是第一次发生。人们实际上否决了其他答案以获得接受或其他什么?这里非常好,令人鼓舞的社区。​​span>
    • 每个人都得到了奇怪的反对票,这里没有解释。我想这只是由于大量的观众。但是,如果你想帮助别人,没有人能阻止你:)
    • Group by 在您的回答中不遵循 SQL 规则,如果打开该选项,您将收到类似“这与 sql_mode=only_full_group_by 不兼容”的错误。
    • @DanielE。我使用“sql_mode=only_full_group_by”在本地 MySQL 数据库上进行了测试,但没有收到任何错误...
    • "#1055 - SELECT 列表的表达式 #2 不在 GROUP BY 子句中,并且包含在功能上不依赖于 GROUP BY 子句中的列的非聚合列 't.matched';这与 sql_mode 不兼容=only_full_group_by" 你可以在这里测试它:demo.phpmyadmin.net/master-config/db_sql.php?db=test_so
    猜你喜欢
    • 2011-05-30
    • 1970-01-01
    • 2015-11-01
    • 1970-01-01
    • 2021-09-06
    • 1970-01-01
    • 1970-01-01
    • 2012-12-06
    • 1970-01-01
    相关资源
    最近更新 更多