首页 > 解决方案 > MySQL:查找重复记录但从列表中排除第一个记录

问题描述

我有一个下表:

MariaDB [groupdb]> select * from album;    
+----+---------+---------+
| id | artist  | user_id |
+----+---------+---------+
|  1 | ArtistX |   45677 |
|  2 | ArtistY |  378798 |
|  3 | ArtistX |   45677 |
|  4 | ArtistZ |  123456 |
|  5 | ArtistY |  888888 |
|  6 | ArtistX |    2312 |
|  7 | ArtistY |  378798 |
|  8 | ArtistY |  888888 |
|  9 | ArtistY |  888888 |
+----+---------+---------+
9 rows in set (0.000 sec)

我尝试使用以下查询查找重复记录:

MariaDB [groupdb]> select * from album where artist IN (select artist from album group by artist having count(artist)>1) and user_id IN (select user_id from album group by user_id having count(user_id)>1);
+----+---------+---------+
| id | artist  | user_id |
+----+---------+---------+
|  1 | ArtistX |   45677 |
|  2 | ArtistY |  378798 |
|  3 | ArtistX |   45677 |
|  5 | ArtistY |  888888 |
|  7 | ArtistY |  378798 |
|  8 | ArtistY |  888888 |
|  9 | ArtistY |  888888 |
+----+---------+---------+
7 rows in set (0.001 sec)    

这一切都很好。虽然我希望我的结果集有一个重复列表,但不包括第一个。即类似于下面的一个。
预期输出

+----+---------+---------+
| id | artist  | user_id |
+----+---------+---------+
|  3 | ArtistX |   45677 |
|  7 | ArtistY |  378798 |
|  8 | ArtistY |  888888 |
|  9 | ArtistY |  888888 |
+----+---------+---------+

正如您在上面看到的,它是一个重复列表,不包括第一个。

注意:对于要复制的记录,艺术家user_id必须相同。
我的挑战是提出一个导致上述结果集的查询。

标签: mysqlsqlduplicates

解决方案


您要选择所有存在具有较小 ID 的同级的行。在我看来,最简单的表达方式是:

select * 
from album a
where exists
(
  select * 
  from album a2
  where a2.artist = a.artist
  and a2.user_id = a.user_id
  and a2.id < a.id
)
order by id;

推荐阅读