我需要一些帮助。我坚持这个SQL查询。
我有2个表团队和功能。小组包含ID
,Teamname
。功能包含ID
,Role
角色决定一个人是一名球员还是一名教练(0代表球员,1代表教练)。
我应该列出所有存在的球队,但他们应该只计算球员,甚至没有球员的球队应该被列入。例如,那里的球队只有教练。
我找不到计算团队中每个人的方法。
这是我最接近的:
select teamname,
count(*)
from function left outer join team on team.id = function.id
WHERE role=0
group by teamname;
答案 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
表中是唯一的,则表示team
和function
之间存在一对一的关系,并且查询永远不会返回大于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)的条目。