2013-03-06 60 views
1

我有4个表:SQL相关的棘手计数()查询

country

  • ID

region

  • ID
  • fk_country

dept

  • ID
  • fk_region

user

  • ID
  • fk_country
  • fk_region
  • fk_dept

user表只有一个外键集(其他应为空)。

我们没有设置外键fk_pays,因为我们可以通过fk_region.fk_country通过fk_dept.fk_region.fk_country触摸country表(当fk_dept设置)

OR

(当fk_region设置)

这种行为是为了避免冗余。

我的问题是:

如何获取与包含用户(COUNT)在该国号的相加列的所有国家的信息?

我知道如何使用不同的请求为每个支付(使用COALESCE),但我希望在一个单一的。

+0

我没有尝试任何事情,似乎复杂(加入,并加不同'COUNT的'query) – Leto 2013-03-06 12:44:00

+0

'select country。*,count(user.id)from country,user where country.id = user.fk_country group by country.id' – deadlock 2013-03-06 12:53:15

+0

我不是想要做一个简单的'COUNT'查询 – Leto 2013-03-06 13:01:47

回答

0

只需使用或加入

SELECT c.id, c.name, count(DISTINCT u.id) 
FROM country AS c 
JOIN region AS r ON c.id=r.fk_country 
JOIN dept AS d ON r.id=d.fk_region 
JOIN users AS u ON u.fk_country=c.id OR u.fk_region=r.id OR u.fk_dept=d.id 
GROUP BY c.id,c.name; 

http://sqlfiddle.com/#!1/3026f/1

+0

终于不那么复杂,聪明:) – Leto 2013-03-06 12:58:04

+0

@Leto实际上它不能正常工作。现在应该没问题。 – 2013-03-06 15:05:51

+0

为什么用户不止一次被提取? – Leto 2013-03-06 16:19:25

0

试试这个:

SELECT count(user.id), country.name, region.name, dept.name FROM user 
    JOIN country ON user.fk_country = country.id 
    JOIN region ON region.fk_country = country.id 
    JOIN dept ON dept.fk_region = region.id 
     GROUP BY country.id 
+0

这假设'user.fk_country'已设置,但并非总是如此。此外,下两个连接的目的是什么? (选择列除外) – Leto 2013-03-06 12:57:36

+0

如果用户与任何国家/地区无关,您希望得到哪些用户数。它做了INNER JOIN,这意味着它在所提供的国家中统计用户。 JOIN的选择是为了选择“FULL”信息,就像在你标记的答案中一样。我没有注意到,你有所有的fk在用户表 – apoq 2013-03-06 13:00:52