如何在GROUP BY+HAVING单字段过滤时展示用户表其他字段?
解决方法
首先纠正你SQL里的拼写错误:uder_identification_code应该是user_identification_code,这个笔误可能会影响查询结果。
你之前的问题出在:GROUP BY后直接SELECT非分组、非聚合的字段,或者在HAVING里写lastname这类无意义条件,数据库无法识别该如何处理这些字段。要获取用户的其他字段,不能直接在原GROUP BY查询里添加,推荐两种可行思路:
方法一:子查询关联原表
先筛选出符合条件且重复的信用卡号,再关联原表拿到完整用户信息:
SELECT u.* FROM user u JOIN ( -- 先找出重复的目标信用卡号 SELECT creditcard FROM user WHERE preferred_card = '1' AND user_identification_code = 'creditcard' GROUP BY creditcard HAVING COUNT(1) > 1 ) dup_cards ON u.creditcard = dup_cards.creditcard -- 再次过滤条件,确保只取目标记录 WHERE u.preferred_card = '1' AND u.user_identification_code = 'creditcard';
方法二:窗口函数(适配MySQL8+、PostgreSQL等支持窗口函数的数据库)
用窗口函数按信用卡号统计出现次数,再筛选出次数大于1的记录,直接获取所有字段:
SELECT * FROM ( SELECT *, -- 按creditcard分组统计该卡的重复次数 COUNT(1) OVER (PARTITION BY creditcard) AS card_repeat_count FROM user WHERE preferred_card = '1' AND user_identification_code = 'creditcard' ) temp WHERE temp.card_repeat_count > 1;
这两种方法都能帮你获取所有拥有多张首选信用卡的用户完整信息,方便后续数据清理。
内容的提问来源于stack exchange,提问作者Yuan
相关产品推荐
相关产品推荐

