SQL - 团队及其玩家数量

时间:2014-03-31 21:54:33

标签: sql sqlite

我需要一些帮助。我坚持这个SQL查询。

我有2个表团队和功能。小组包含IDTeamname。功能包含IDRole

角色决定一个人是一名球员还是一名教练(0代表球员,1代表教练)。

我应该列出所有存在的球队,但他们应该只计算球员,甚至没有球员的球队应该被列入。例如,那里的球队只有教练。

我找不到计算团队中每个人的方法。

这是我最接近的:

select teamname, 
       count(*) 
from function left outer join team on team.id = function.id 
WHERE role=0 
group by teamname;

3 个答案:

答案 0 :(得分:1)

以下是获得结果的一种方法:

SELECT t.teamname
     , COUNT(1) AS player_count
  FROM team t
  LEFT
  JOIN function f
    ON f.id = t.id 
   AND f.role = 0   
 GROUP BY t.teamname;

- 或 -

SELECT t.teamname
     , IFNULL(SUM(f.role=0),0) AS player_count
  FROM team t
  LEFT
  JOIN function f
    ON f.id = t.id 
 GROUP BY t.teamname;

这些查询使用team表作为驱动程序,因此即使函数中没有匹配的行,我们也会从team获取行。在第一个查询中,我们将role = 0条件包含为连接谓词,但它是一个外连接。在第二个查询中,它仍然是外连接,但我们只“计算”具有role = 0的行。

注意看起来您的模型中缺少某些内容; id=id连接谓词看起来很奇怪;奇怪的是,我们在函数表中有一个名为id的列,它是一个引用team.id的外键。

通常,id是表中的代理主键,它在该表中是唯一的。如果它在function表中是唯一的,则表示teamfunction之间存在一对一的关系,并且查询永远不会返回大于1的计数。

同样,我强烈怀疑模型中缺少“成员”实体。

我们期望的是这样的东西::

team
  id         PK
  teamname

member
  id         PK
  team_id    FK references team.id
  role       0=player, 1=coach 

这样查询看起来像这样:

SELECT t.teamname 
     , IFNULL(SUM(m.role=0),0) AS player_count
     , IFNULL(SUM(m.role=1),0) AS coach_count
  FROM team t
  LEFT
  JOIN member m
    ON m.team_id = t.id

答案 1 :(得分:0)

SELECT子句中存在聚合函数时,您无法选择单个列。

要计算表中所有行的计数并获取团队的名称,您必须仅使用SELECT子句中的聚合列或函数。例如:

SELECT COUNT(*), team.teamname
FROM function LEFT OUTER JOIN team ON team.id = function.id
WHERE function.role = 0
GROUP BY team.teamname

为您提供角色等于0 的所有行以及团队名称

答案 2 :(得分:0)

请改用以下内容:

SELECT teamname,SUM(IF(role=0,1,0)) players
 FROM function 
 LEFT JOIN team USING (id)
 GROUP BY teamname;

这只计算来自'function'的具有玩家角色(0)的条目。