如何在SQL中合并查询得到按进球数排序的球员姓名及进球数三列结果?
最优解决方案
你不需要拆分两个独立查询再合并,直接单次关联两张表就能得到目标结果,参考语句如下:
SELECT p.name, p.surname, COUNT(g.id) AS goals FROM players p INNER JOIN goals g ON p.id = g.player_id GROUP BY p.id, p.name, p.surname ORDER BY goals DESC LIMIT 5;
写法说明
- 直接用球员表主键
id作为和进球表的关联键,避免姓名重复导致的统计错误 - 分组时同时带入球员ID、姓名、姓氏,符合SQL严格模式下的分组语法要求,不会出现非法分组报错
- 统计后直接按进球数倒序取前5,一步输出你需要的三列结果,执行效率更高
你之前JOIN丢失数据的原因
你之前写的第二个查询只返回了进球数字段,没有带回对应的player_id关联键,两个子查询合并时没有准确的匹配依据,才会出现数据丢失的情况。如果确实需要用两个子查询合并的写法,可以参考如下语句:
SELECT t1.name, t1.surname, t2.goals FROM players t1 INNER JOIN ( SELECT player_id, COUNT(*) AS goals FROM goals GROUP BY player_id ORDER BY goals DESC LIMIT 5 ) t2 ON t1.id = t2.player_id ORDER BY t2.goals DESC;
内容的提问来源于stack exchange,提问作者AxelCagira
相关产品推荐
相关产品推荐

