如何用MySQL查询每位参与游戏用户的最高得分?需处理无游戏记录用户吗?
解决方案:MySQL查询用户最高得分
这是个典型的关联表聚合查询需求,我来帮你梳理清楚两种场景的实现方式:
1. 仅查询参与过游戏的用户(符合需求描述)
如果严格按照需求“仅查询出每位参与过游戏的用户”,咱们可以用INNER JOIN关联两张表,再配合GROUP BY和MAX()聚合函数来实现:
SELECT u.fName, u.lName, MAX(g.score) AS highest_score FROM user u INNER JOIN game g ON u.ID = g.userID GROUP BY u.ID, u.fName, u.lName;
代码解释:
INNER JOIN会自动过滤掉没有匹配游戏记录的用户(也就是Joe Smith),只保留有游戏数据的用户;GROUP BY u.ID, u.fName, u.lName:按用户的唯一ID分组(避免同名用户被错误合并),同时包含姓名字段保证输出完整;MAX(g.score):计算每个用户的最高得分。
执行后会得到你要的结果:
fName | lName | highest_score Jane | Doe | 20 Sam | Mills | 22
2. 是否需要考虑userID=1的Joe Smith?
这完全取决于你的业务需求:
- 如果需求明确是只看参与过游戏的用户,那不需要额外处理,上面的SQL已经自动排除了Joe;
- 如果业务需要把所有用户都展示出来(包括没玩过游戏的,最高得分可以显示
NULL或者0),那就要用LEFT JOIN来实现:
-- 显示NULL表示无游戏记录 SELECT u.fName, u.lName, MAX(g.score) AS highest_score FROM user u LEFT JOIN game g ON u.ID = g.userID GROUP BY u.ID, u.fName, u.lName; -- 用COALESCE把NULL替换为0 SELECT u.fName, u.lName, COALESCE(MAX(g.score), 0) AS highest_score FROM user u LEFT JOIN game g ON u.ID = g.userID GROUP BY u.ID, u.fName, u.lName;
这种情况下,Joe Smith的记录会被展示出来,最高得分是NULL或者0。
内容的提问来源于stack exchange,提问作者Max
相关产品推荐
相关产品推荐

