MySQL查询修改:连接表后仅统计唯一元素的实现方法
修改查询以统计不同元素的签到次数
嘿,我来帮你调整这个查询!首先得先提一下原查询里的小问题:你在SELECT里写了b.*和c.*,但GROUP BY只指定了c.beer_id。在大多数现代数据库的严格模式(比如MySQL的ONLY_FULL_GROUP_BY)下,这会触发报错——因为非聚合的列没出现在GROUP BY里,数据库没法确定要返回哪一行的c.*数据。我们先修正这个问题,再针对“统计不同元素”的需求调整。
下面分两种常见场景给出修改方案:
场景1:统计不同用户的签到次数(同一用户多次签到同一款啤酒只算1次)
如果你想统计每款啤酒被多少不同用户签到过,而不是单纯的总签到次数,就需要用COUNT(DISTINCT c.user_id)来实现去重计数:
SELECT COUNT(DISTINCT c.user_id) AS unique_user_checkins, b.* FROM beer b JOIN checkin c ON c.beer_id = b.id GROUP BY b.id, b.name -- 注:如果你的数据库支持主键覆盖(比如PostgreSQL、MySQL 8.0+),只写GROUP BY b.id就足够;否则要把beer表所有要查询的列都加进来 ORDER BY unique_user_checkins DESC
场景2:统计去重的签到记录(排除重复的签到条目)
如果你的checkin表可能存在重复的签到记录(比如同一id的重复行),想要统计唯一的签到次数,就用COUNT(DISTINCT c.id):
SELECT COUNT(DISTINCT c.id) AS unique_checkins, b.* FROM beer b JOIN checkin c ON c.beer_id = b.id GROUP BY b.id, b.name ORDER BY unique_checkins DESC
补充:如果只是修正原查询的语法问题(保留总签到次数)
如果你其实还是想要统计总签到次数,只是原查询语法有问题,那只需要去掉SELECT里的c.*,并调整GROUP BY即可:
SELECT COUNT(c.id) AS total_checkins, b.* FROM beer b JOIN checkin c ON c.beer_id = b.id GROUP BY b.id, b.name ORDER BY total_checkins DESC
内容的提问来源于stack exchange,提问作者Robou
相关产品推荐
相关产品推荐

