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

时间:2018-12-27 02:11:09

标签: sql distinct

我目前正在通过以下练习来学习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命令在这种情况下不起作用?

谢谢!

3 个答案:

答案 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