我目前正在通过以下练习来学习SQL:https://sqlzoo.net/wiki/The_JOIN_operation
我在示例8中询问:“显示对德国进球的所有球员的姓名。”
这是我目前拥有的:
SELECT DISTINCT(goal.player), goal.gtime, game.team1, game.team2
FROM game JOIN goal ON (goal.matchid = game.id)
WHERE (game.team1='GER' OR game.team2='GER') AND (goal.teamid<>'GER')
我希望结果将只返回唯一的名称。但是,事实并非如此,因为我们看到“ Mario Balotelli”被列出了两次。为什么DISTINCT命令在这种情况下不起作用?
谢谢!
答案 0 :(得分:3)
DISTINCT在记录级别上进行操作,因此您应在整个行中使用distinct,或者如果您需要在结果中显示额外的字段,则需要在播放器上执行GROUP BY并通过加入来合并其他字段分组的结果。
但我认为预期的答案只是球员姓名,所以查询将是这样的:
SELECT DISTINCT player
FROM game JOIN goal ON matchid = id
WHERE (game.team1='GER' OR game.team2='GER') AND (goal.teamid<>'GER')
答案 1 :(得分:0)
看起来“马里奥·巴洛特利”可以有多个目标。或者可以具有与Team1和Team2不同的贡献值。因此,请尝试删除select子句中的其他列。
答案 2 :(得分:0)
DISTINCT根据所有选定的列获取不同的行。由于目标时间不同,因此选择该列将使行彼此不同(相异)。
该问题仅要求您选择玩家的姓名
SELECT DISTINCT player
FROM game
JOIN goal ON matchid = id
WHERE (team1='GER' OR team2='GER')
AND (teamid <>'GER')
此链接似乎对进一步阅读https://www.designcise.com/web/tutorial/what-is-the-order-of-execution-of-an-sql-query
很有用。编辑:如果您希望有不止一列,但只希望聚集一个球员列表,则可以最小/最大/加/平均该组的其他数据。
SELECT player, team1, team2, MIN(gtime) AS min_gtime, MAX(gtime) AS max_gtime, COUNT(1) AS goals_scored
FROM game
JOIN goal ON matchid = id
WHERE (team1='GER' OR team2='GER')
AND (teamid <>'GER')
GROUP BY player, team1, team2