mysql 为什么这些联接语句以不同的方式影响我的ORDER子句?

oo7oh9g9  于 2022-12-10  发布在  Mysql
关注(0)|答案(1)|浏览(715)

我正在熟悉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
flvtvl50

flvtvl501#

这两个查询之间的区别是对于没有目标的比赛。INNER JOIN不会为这些游戏返回任何行。LEFT JOIN将为这些游戏返回一行,但goals表中的所有列都将是NULL
因为您是按goal.matchid分组和排序的,所以当其他分组列相同时,这将把所有没有进球的游戏分组在一起。您应该在GROUP BYORDER BY中使用game.id而不是goal.matchid

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, id, team1, team2
ORDER BY mdate, id, team1, team2

相关问题