MySQL需GROUP BY但查询结果异常,求多用户共享reportID的正确查询
解决多用户共享reportID的查询问题
这个需求的核心是要找出同时包含所有指定用户名的reportID,再基于这些ID提取对应的用户记录,咱们一步一步来修正你的查询:
问题出在哪?
你原来的查询逻辑有个明显误区:
- 当
GROUP BY reportID, username时,每个分组是(reportID, username)的唯一组合,每个组合里的reportID计数最多是1,所以HAVING count(reportID) >1永远不满足,自然返回0条结果。 - 去掉
username的话,又触发only_full_group_by规则——因为SELECT里的username既不在GROUP BY里,也没有被聚合函数处理,数据库无法确定要返回哪个值。
正确的查询方法
方法1:子查询筛选有效reportID(兼容所有MySQL版本)
先通过子查询找出包含所有目标用户的reportID,再关联原表获取对应记录:
SELECT p.reportID, p.username FROM players p INNER JOIN ( -- 筛选出包含所有目标用户名的reportID SELECT reportID FROM players WHERE username IN ('a', 'b') GROUP BY reportID -- 这里的数字要等于你输入的用户名数量,比如输入2个用户就写2 HAVING COUNT(DISTINCT username) = 2 ) AS valid_reports ON p.reportID = valid_reports.reportID WHERE p.username IN ('a', 'b');
方法2:窗口函数(MySQL 8.0+及以上版本适用)
用窗口函数统计每个reportID下包含的目标用户数,再过滤符合条件的记录:
SELECT reportID, username FROM ( SELECT reportID, username, -- 统计当前reportID下包含的目标用户数量 COUNT(DISTINCT CASE WHEN username IN ('a', 'b') THEN username END) OVER (PARTITION BY reportID) AS target_user_count FROM players WHERE username IN ('a', 'b') ) AS temp WHERE target_user_count = 2; -- 等于输入的用户名总数
这两种方法都能完美满足你的需求:输入a和b时,会返回reportID为1的两条记录;如果输入a和c,则会返回reportID为1和3的对应记录。
内容的提问来源于stack exchange,提问作者bluewave41
相关产品推荐
相关产品推荐

