【问题标题】:Assistance with MySQL query for duplicates协助 MySQL 查询重复项
【发布时间】:2013-11-16 20:36:02
【问题描述】:
Table1
  Colum1
    ID      Name        Size
    1       File23      912831823
    2       File29      823472348
    3       File21      912831823
    4       File24      742834882

基本结构如上,现在我正在寻找大小上的重复项,因为有时输入了错误的名称。

SELECT Name, Size, COUNT(Size) AS Counted FROM Column1 GROUP BY Size HAVING (COUNT(Size)>1) ORDER BY Counted DESC

这给了我以下内容

            Name        Size        Counted
            File23      912831823   2

这是一个进步,因为它计算了 Size 被复制的次数,即 2。但我的目标是 得到这样的输出,列出每个重复项,但我不太确定如何格式化该查询。

            Name        Size        Counted
            File23      912831823   2
            File21      912831823   2

我尝试了一些不同的东西,甚至玩弄外连接,但很明显,我对此了解的并不多,谁能把我推向正确的方向? =)

【问题讨论】:

    标签: mysql sql group-by duplicates sql-order-by


    【解决方案1】:

    您必须进行聚合计数,然后重新加入源表:

    SELECT t1.Name, Counts.Size, Counts.Counted 
    FROM
        (
        SELECT Size, COUNT(ID) as Counted
        FROM t1
        GROUP BY Size
        ) Counts
    
        LEFT JOIN t1 ON t1.Size = Counts.Size
    

    【讨论】:

    • 谢谢这是我试图得到的地方,但我仍然想只列出那些重复的,所以我添加了 HAVING (COUNT(Size)>1) 子句以获得预期的输出。
    【解决方案2】:

    您可以通过对聚合查询使用连接来做到这一点:

    select t1.*, agg.cnt
    from table1 t1 join
         (SELECT Size, count(*) as cnt
          FROM table1
          GROUP BY Size
          HAVING COUNT(Size) > 1
         ) agg
         on t1.size = agg.size
    order by agg.cnt desc, size desc;
    

    子查询获取重复的大小。 join 带回原始行。在大多数其他数据库中,您可以改为使用窗口/分析函数来执行此操作。

    【讨论】:

    • 这确实列出了预期的结果,但它也包含该行的所有字段,我只需要列出的两个,所以它比我想要的数据多。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-17
    • 1970-01-01
    • 2011-02-28
    相关资源
    最近更新 更多