我正在熟悉SQLzoo上的SQL,最后一个问题(#13)是提出问题,直到我成功地猜到了解决方案。我最初怀疑我的ORDER BY子句写错了,或者不正确的数据类型是罪魁祸首,但后来I looked up a solution provided by mjsqu here。我只更改了JOIN语句并删除了ORDER BY子句以匹配它们的代码。坦率地说,我仍然不明白为什么ORDER BY语句一开始就没有对日期进行排序。
查看此处查看数据和问题集:https://sqlzoo.net/wiki/The_JOIN_operation
SELECT mdate,
team1,
SUM(CASE WHEN teamid=team1 THEN 1 ELSE 0 END) score1,
team2,
SUM(CASE WHEN teamid=team2 THEN 1 ELSE 0 END) score2
FROM game JOIN goal ON matchid = id
GROUP BY mdate, matchid, team1, team2
ORDER BY mdate, matchid, team1, team2
解决方案代码:
SELECT mdate,
team1,
SUM(CASE WHEN teamid = team1 THEN 1 ELSE 0 END) score1,
team2,
SUM(CASE WHEN teamid = team2 THEN 1 ELSE 0 END) score2
FROM game LEFT JOIN goal ON matchid = id
GROUP BY mdate, matchid, team1, team2
1条答案
按热度按时间flvtvl501#
这两个查询之间的区别是对于没有目标的比赛。
INNER JOIN
不会为这些游戏返回任何行。LEFT JOIN
将为这些游戏返回一行,但goals
表中的所有列都将是NULL
。因为您是按
goal.matchid
分组和排序的,所以当其他分组列相同时,这将把所有没有进球的游戏分组在一起。您应该在GROUP BY
和ORDER BY
中使用game.id
而不是goal.matchid
。