SQL - 不同的不为指定列提供唯一的结果

SQL - Distinct Not Providing Unique Results for Designated Column

我目前正在通过这些练习学习 SQL:https://sqlzoo.net/wiki/The_JOIN_operation

我在示例 8 中要求:"Show the name of all players who scored a goal against Germany."

这是我目前拥有的:

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 命令在这种情况下不起作用?

谢谢!

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')

看起来 "Mario Balotelli" 可以有多个 goal.gtime。或者可以具有来自 Team1 和 Team2 的不同贡献值。因此,请尝试删除 select 子句中的其他列。

DISTINCT 根据所有 selected 列获取不同的行。由于目标时间不同 select 该列将使行彼此不同(不同)。

问题只问你select玩家的名字

SELECT DISTINCT player
FROM game 
JOIN goal ON matchid = id 
WHERE (team1='GER' OR team2='GER')
AND (teamid <>'GER')

这个 link 看起来对进一步阅读很有用 https://www.designcise.com/web/tutorial/what-is-the-order-of-execution-of-an-sql-query

编辑:如果您想要多个列,但只需要一个不同的玩家列表,您在聚合领域中,您可以 min/max/sum/avg 该组的其他数据。

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