mysql复杂选择查询

mysql复杂选择查询,mysql,select,count,Mysql,Select,Count,我有4张桌子: user, administrative_division, assignment, user_has_assignment 在用户和行政区划之间存在多对一关系,其中多个是用户,一个是行政区划。在用户和分配之间,通过用户\u has\u分配表存在多对多关系 我可以使用以下命令获取每个行政区划中的用户数: select division_id, count(*) from user group by division_id; select user_id, count(*) f

我有4张桌子:

user,
administrative_division,
assignment,
user_has_assignment
在用户和行政区划之间存在多对一关系,其中多个是用户,一个是行政区划。在用户和分配之间,通过用户\u has\u分配表存在多对多关系

我可以使用以下命令获取每个行政区划中的用户数:

select division_id, count(*) from user group by division_id;
select user_id, count(*) from user_has_assignment group by user_id;
举个例子,它给了我这样的东西:

division_id count(*)
  1           4
  2           10
division_id  user_count assignment_count
     1           10            20 
     2            2            4
等等

我可以使用以下命令获取每个用户拥有多少个工作分配:

select division_id, count(*) from user group by division_id;
select user_id, count(*) from user_has_assignment group by user_id;
这给出了类似的结果

user_id count(*)
   1       2
   2       10
但我不知道如何在一次查询中得到这样的结果:

division_id count(*)
  1           4
  2           10
division_id  user_count assignment_count
     1           10            20 
     2            2            4

其中user\u count是每个行政区划中的用户总数,assignment\u count是一个特定行政区划中的用户拥有的所有工作分配的总数。

您只需加入上面的表,并按部门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

检查查询中的字段名称,并相应地替换它们,以便查询在您的架构上工作。

您只需连接上面的表并按分区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

检查查询中的字段名,并相应地替换它们,以便查询在您的架构上工作。

如果一个分区中有两个用户具有相同的分配,您希望发生什么?这会给计数增加1或2吗?如果一个分区中有两个用户具有相同的分配,您希望发生什么?这会给计数增加1或2吗?@Nurzhan:没问题-如果你的问题得到了回答,请务必检查正确答案,以帮助其他可能遇到类似问题的人issue@Nurzhan,我不认为如果一个部门中有两个用户有相同的任务,那么这会增加2。@Nurzhan:没问题-如果您的问题得到了回答,请务必检查正确的答案,以帮助其他可能遇到类似问题的人issue@Nurzhan,我认为,如果一个部门中有两个用户有相同的任务,那么这不会使计数增加2。