MySQL组元素和计算每个组中的元素

时间:2018-03-17 17:34:23

标签: mysql select group-by count where-in

我正在完成一项任务,我的提示是"列出所有在2011年之前仍然有效的团队(尚未解散)。对于每个这样的团队,分别给出团队名称,创建日期以及分别扮演Protoss,Terran和Zerg的当前团队成员的数量。按名称按字母顺序对团队进行排序"下面是数据库架构的图片。database schema

我的查询没有通过他们的游戏竞赛(Protoss,Terran和Zerg)正确地对成员进行分组。相反,它将游戏比赛分组并为每个游戏竞赛输出每行一行三行,而不是三个具有相应游戏竞赛价值和每个团队一行的单独列。以下是来自players.csv,teams.csv,members.csv,tournaments.csv,earnings.csv和matches.csv的一些示例数据。 players.csv members.csv teams.csv earnings.csv matches.csv tournaments.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;

感谢您提供任何可能的帮助。

1 个答案:

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