2011-03-22 79 views
0

我有4个表:MySQL的复杂的选择查询

user, 
administrative_division, 
assignment, 
user_has_assignment 

用户和administrative_division之间有一个多对一的关系,其中许多是用户和一个是administrative_division。在用户和分配之间,通过user_has_assignment表存在多对多关系。

我能得到多少用户在每个administrative_division使用以下命令:

select division_id, count(*) from user group by division_id; 

其中,例如,给了我这样的事情:

division_id count(*) 
    1   4 
    2   10 

我可以通过使用这个命令得到每个用户拥有多少分配:

select user_id, count(*) from user_has_assignment group by user_id; 

这给类似的结果

user_id count(*) 
    1  2 
    2  10 

但我不知道我怎么能在一个这样的查询结果得到:

division_id user_count assignment_count 
    1   10   20 
    2   2   4 

其中USER_COUNT在每个用户的总数administrative_division和assignment_count是来自一个特定administrative_division的用户拥有的所有分配的总和。

+0

如果您在同一个任务中有两个用户,您希望发生什么?那会给计数加1或2吗? – jswolf19 2011-03-22 12:23:21

+0

它会增加2的数量。 – Nurjan 2011-03-22 13:33:48

回答

2

你只需要加入以上和组结果由devision_id表,所以你会得到一个单列每等分像这样:在查询

SELECT ad.devision_id, 
     COUNT(DISTINCT u.user_id) AS user_count, 
     COUNT(DISTINCT a.assignment_id) AS assignment_count 
FROM user u 
    JOIN administrative_division ad ON u.devision_id = ad.devision_id 
    LEFT JOIN user_has_assignment ucon ON u.user_id = ucon.user_id 
    LEFT JOIN assignment a ON a.assignment_id = ucon.assignment_id 

校验字段名和相应的替换它们以便查询在您的模式上工作。

+0

非常感谢,BigFatBaby))。有用。 – Nurjan 2011-03-22 16:07:33

+0

@Nurzhan:完全没问题 - 如果你的问题得到解答,一定要检查正确的答案,以帮助其他人可能遇到类似的问题 – BigFatBaby 2011-03-22 16:13:05

+0

@Nurzhan,我不认为这会增加2计数,如果两一个部门的用户具有相同的任务。 – jswolf19 2011-03-22 23:58:58