mysql - 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必须相同。
我的挑战是提出一个导致上述结果集的查询。
解决方案
您要选择所有存在具有较小 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;
推荐阅读
- mysql - 子查询:使用having子句过滤掉包含子查询空值的外部查询行是一种好习惯吗
- html - 如何在横幅上堆叠文字?& 网站其余部分的背景图片
- docker - 从外部访问 kafka docker
- r - 使用 R,对于每一年,我需要将相同两个日期之间不同年份的销售额相加
- visual-studio - 如何在 Gitlab 上找到我们没有上传(git push),只是添加(git add)并评论的更改?
- payment-gateway - 奇怪的 CSOB Payment Gw 响应 {"resultCode":900,"resultMessage":"Internal error"}
- snowflake-cloud-data-platform - 执行某些活动的特权列表
- arrays - 猫鼬将新对象插入到数组中的文档中没有重复
- selenium - 无法调用“org.openqa.selenium.WebDriver.manage()”,因为“this.driver”为空
- django - Django 在同一个视图函数中使用会话和 cookie