我有一个国家足球俱乐部的桌子。这些字段是“teamName”、“playerName”和“country”。
我想统计一下所有球员都是外国人的俱乐部
. 我尝试了以下查询,但我认为它不起作用,因为它似乎在我们至少有一个外国人时才算数,但我希望如果一支球队的所有球员都是外国人,它就会算数!
SELECT COUNT(DISTINCT teamName)
FROM teams
WHERE country not like '%England%'
请指教。谢谢!
一种方法是:
SELECT COUNT(DISTINCT teamName)
FROM teams T1
WHERE NOT EXISTS
( select * from teams T2
WHERE T1.teamName=T2.teamName and T2.country like '%England%')
嗯,甚至连接似乎需要一个内部查询:
SELECT COUNT(*)
FROM (
SELECT teamName,
SUM(country like '%England%') AS Locals
FROM teams
GROUP BY teamName
) AS t
WHERE Locals = 0;
似乎应该有一个更短的答案虽然......
快速而肮脏的答案,它只传递数据,没有子查询。这会选择所有外国的团队。CASE
如果这不是您想要的,您可以使用表达式。
SELECT team_name
FROM teams
GROUP BY team_name
HAVING COUNT(country)=
SUM(CASE country != 'England' WHEN TRUE THEN 1 ELSE 0 END);
更长的答案:您的架构未标准化,但应该标准化。您想要 的 表teams
和第二个表players
,其中包括该球员当前球队的球队表的外键。这是基本的数据库规范化。但是,用FROM
这两个表的连接替换单个表,相同的GROUP BY
/HAVING
技巧有效。