我有这样的疑问:
SELECT u.id, u.service, u.subscription_date
FROM user u
WHERE EXISTS (
SELECT 1
FROM user u2
WHERE u2.subscription_date = u.subscription_date
AND u2.service = u.service
GROUP BY u2.service, u2.subscription_date
HAVING COUNT(*) > 1
);
我的问题是,我不仅仅希望找到具有重复的 subscription_date 和 service 值的用户。我希望查询专门为我提供用户 ID 列表,其中相同的服务和订阅日期出现两次。
澄清一下:
假设我有以下用户:
user_id: 001,
subscription_date: 2024-01-01
service: basic
user_id: 002,
subscription_date: 2024-01-01
service: plus
user_id: 002,
subscription_date: 2023-01-01
service: plus
user_id: 003,
subscription_date: 2024-01-01
service: premium
user_id: 003,
subscription_date: 2024-01-01
service: premium
在我希望运行的查询中,它应该只返回用户 id 003,因为虽然用户 id 002 也有服务的副本,但它没有重复的订阅日期。
我不知道如何将此条件转换为查询。
这听起来很简单
select user_id,
service,
subscription_date
from users
group by user_id,service,subscription_date
having count(*) > 1;
另一种方法是使用
COUNT(*) OVER()
窗口函数(需要MySQL 8+)
查询,
select user_id,
subscription_date,
service
from (
select *,
count(*) over (partition by user_id,subscription_date,service order by user_id asc ) as cnt
from users
) sub
where cnt > 1;
结果,
user_id subscription_date service
3 2024-01-01 premium
3 2024-01-01 premium
您似乎只需要所有列上都有重复项的记录 - id、subscription_date 和 service,在这种情况下,它只是所有列上的简单分组:
SELECT *
FROM user
GROUP BY user_id, service, subscription_date
HAVING COUNT(*) > 1
或者如果表 user 中有更多列,请将 * 替换为这 3 列的列表。