我正在完成一项任务,我的提示是"列出所有在2011年之前仍然有效的团队(尚未解散)。对于每个这样的团队,分别给出团队名称,创建日期以及分别扮演Protoss,Terran和Zerg的当前团队成员的数量。按名称按字母顺序对团队进行排序"下面是数据库架构的图片。
我的查询没有通过他们的游戏竞赛(Protoss,Terran和Zerg)正确地对成员进行分组。相反,它将游戏比赛分组并为每个游戏竞赛输出每行一行三行,而不是三个具有相应游戏竞赛价值和每个团队一行的单独列。以下是来自players.csv,teams.csv,members.csv,tournaments.csv,earnings.csv和matches.csv的一些示例数据。
这是我的查询。
SELECT t.name
, t.founded
, COUNT(p.game_race = '"P"')
, COUNT(p.game_race = '"Z"')
, COUNT(p.game_race = '"T"')
FROM teams t
, members m
, players p
WHERE t.team_id = m.team
AND p.player_id = m.player
GROUP
BY t.name
, p.game_race;
感谢您提供任何可能的帮助。
答案 0 :(得分:0)
您应该将数据库分组到未聚合的选定字段。在这种情况下你应该使用SUM,例如当p.game_race='"P"'
为真时返回1,所以我们添加一个就像计算该项一样。使用count例如p.game_race='"P"'
是false 0是返回但是因为0与null不同,所以计算错误。所以试试这个:
SELECT t.name, t.found,
SUM(p.game_race='"P"'),
SUM(p.game_race='"Z"'),
SUM(p.game_race='"T"')
FROM teams t LEFT JOIN member m
ON t.team_id = m.team LEFT JOIN players p
ON p.player_id = m.player
WHERE t.disbanded=0 AND t.founded<STR_TO_DATE('%d-%m-%Y','01-01-2011')
GROUP BY t.name, t.found
ORDER BY t.name;