【问题标题】:Find duplicates in the same table in MySQL在 MySQL 的同一个表中查找重复项
【发布时间】:2012-02-11 11:15:12
【问题描述】:

我有一个包含两列的表格 - 艺术家,release_id

我可以运行什么查询来显示重复记录?

例如我的桌子是

ArtistX : 45677
ArtistY : 378798
ArtistX : 45677
ArtistZ : 123456
ArtistY : 888888
ArtistX : 2312
ArtistY: 378798

查询应该显示

ArtistX : 45677
ArtistX : 45677
ArtistY : 378798
ArtistY : 378798

【问题讨论】:

    标签: mysql


    【解决方案1】:

    您可以对感兴趣的列进行分组来确定是否存在重复。

    SELECT
        artist, release_id, count(*) no_of_records
    FROM table
    GROUP BY artist, release_id
    HAVING count(*) > 1;
    

    【讨论】:

      【解决方案2】:
      SELECT id,artist,COUNT(*) FROM myTable
      GROUP BY artist, release_id HAVING COUNT(*) > 1
      

      【讨论】:

        【解决方案3】:

        你可以试试这样的

        select artist, count(*) from mytable group by artist having count(*) > 1;
        

        会输出

        artist   count(*)
        45677    2
        378798   2
        

        【讨论】:

          【解决方案4】:

          选择 艺术家,release_id,count(*) no_of_records,group_concat(id) 从表 GROUP BY 艺术家,release_id 有计数(*) > 1;

          同时添加 group_concat(id) 可以获得所有重复项的 id。

          【讨论】:

          • 感谢 group_concat,您是唯一一个回答问题的人
          【解决方案5】:
          SELECT row, COUNT(row) AS num FROM mytable GROUP BY row HAVING (num > 1);
          

          【讨论】:

            【解决方案6】:
            select * from table where artist IN (select artist from table group by artist having count(ID)>1) and release_id IN (select release_id from table group by release_id having count(release_id)>1);
            

            将获取:

            ArtistX : 45677
            ArtistX : 45677
            ArtistY : 378798
            ArtistY : 378798
            

            【讨论】:

              【解决方案7】:

              您可以将此查询用于相同的结果。它对我有用

              SELECT firstname, lastname, list.address FROM list
              INNER JOIN (SELECT address FROM list
              GROUP BY address HAVING count(id) > 1) dup ON list.address = dup.address
              

              【讨论】:

                【解决方案8】:
                SELECT id,artist,COUNT(id) as found FROM table GROUP by id HAVING found > 1
                

                【讨论】:

                  【解决方案9】:
                  SELECT artist, count(*) 
                  FROM tableName 
                  GROUP BY artist 
                  HAVING count(*) > 1;
                  

                  【讨论】:

                    【解决方案10】:

                    试试这个:

                    SELECT A.ARTIST,A.RELEASE_ID FROM ARTISTS A
                    WHERE EXISTS(
                    SELECT 'X' FROM ARTISTS B
                    WHERE B.ARTIST = A.ARTIST AND B.RELEASE_ID = A.RELEASE_ID
                    GROUP BY B.ARTIST,B.RELEASE_ID
                    HAVING COUNT(B.ARTIST)>1)
                    ORDER BY A.ARTIST;
                    

                    【讨论】:

                      【解决方案11】:

                      此方法可能不适合您,但如果您想删除重复项并在确保它们确实是重复项的同时执行此操作,您可以尝试以下方法:

                      1. 将您的table1 复制到table2,例如:

                        CREATE TABLE table2 AS SELECT * FROM table1;
                        
                      2. table1添加一个新列,例如命名为count

                      3. 运行查询(假设release_id 应该是唯一列):

                      UPDATE table1 AS t1 SET t1.kount = (SELECT COUNT(*) FROM table2 AS t2 WHERE t1.release_id = t2.release_id)
                      
                      1. 删除表table2

                      2. 使用table1.kount 查找您的重复项并删除它们或其他内容。最好在PHP/Python/Perl。例如,通过这种方式,您可以确保它们确实是重复的,并且只有相同的 release_id。相同的release_id 可能是偶然给出的,并且标题、出版年份等可能不同。因此,只需将您的代码放在这里过滤重复项(伪代码):

                      foreach (sql(SELECT * FROM table1 WHERE kount>1)) do
                          //do something
                      

                      【讨论】:

                        【解决方案12】:

                        你也可以试试这样的:

                        SELECT W.artist, W.release_id FROM table W, table W1 
                        WHERE W.artist= W1.artist AND W.release_id = W1.release_id;
                        

                        【讨论】:

                          【解决方案13】:

                          如果一行中有多个唯一列,则可以使用:

                          DELETE FROM table WHERE id in(
                              SELECT x.id 
                              FROM ( 
                                  SELECT *,count(id) cc FROM table group by col1,col2,col3... 
                              ) x
                              WHERE x.cc>1
                          )
                          

                          【讨论】:

                            猜你喜欢
                            • 1970-01-01
                            • 2022-01-06
                            • 2020-10-17
                            • 2020-06-18
                            • 1970-01-01
                            • 1970-01-01
                            • 2020-01-08
                            • 2015-01-20
                            • 1970-01-01
                            相关资源
                            最近更新 更多