MySQL查询:获取仅拥有一张已使用工单的用户及其工单日期
解决方案
你可以通过两种方式实现需求:
方法一:分组筛选+HAVING子句
先通过分组统计每个用户的工单数量,筛选出仅拥有1张工单的用户,再关联原表获取对应工单信息:
SELECT w.id, w.user_id, w.used_at FROM washtickets w JOIN ( SELECT user_id, MIN(used_at) AS used_at FROM washtickets WHERE deleted_at IS NULL GROUP BY user_id HAVING COUNT(*) = 1 -- 筛选仅拥有1张工单的用户 ) AS single_ticket_users ON w.user_id = single_ticket_users.user_id AND w.used_at = single_ticket_users.used_at WHERE w.deleted_at IS NULL ORDER BY w.used_at ASC;
方法二:窗口函数(更简洁)
使用COUNT() OVER()窗口函数直接统计每个用户的工单总数,再筛选总数为1的记录:
SELECT id, user_id, used_at FROM ( SELECT id, user_id, used_at, -- 统计当前用户的工单总数 COUNT(*) OVER(PARTITION BY user_id) AS total_tickets FROM washtickets WHERE deleted_at IS NULL ) AS ticket_stats WHERE total_tickets = 1 ORDER BY used_at ASC;
说明
- 两种方法都保留了
deleted_at IS NULL的条件,确保只统计未删除的工单 - 方法一通过分组聚合筛选目标用户,再关联取工单详情;方法二用窗口函数一次性完成统计和筛选,逻辑更直观,多数数据库下性能表现更优
内容的提问来源于stack exchange,提问作者anderlaini
相关产品推荐
相关产品推荐

