MySQL使用零连接和计数查询

时间:2014-01-28 19:18:48

标签: mysql sql

我一直盯着那么多SQL代码,我的大脑几乎已经糊涂了。

我会快点。下面是我的表结构,省略了不相关的列:

attendance_history:              member_info:
_____________________            ________________________
|   Date   |   ID   |            |   ID   | Design Team |
|----------|--------|            |--------|-------------|
|   1/27   |    1   |            |    1   |     DT1     |
|   1/28   |    1   |            |    2   |     DT2     |
|   1/29   |    2   |            |    3   |     DT2     |
|   1/29   |    3   |            |--------|-------------|
|----------|--------|

我的最终目标是获得每个设计团队的出勤率。但我相信除了一部分外,我已经完成了所有的逻辑:我需要获得每个设计团队的参与者数量。

这是我需要的一个例子:

__________________________________
|   Date   | Design Team | Count |
|----------|-------------|-------|
|   1/27   |     DT1     |   1   |
|   1/28   |     DT1     |   1   |
|   1/29   |     DT1     |   0   |
|   1/27   |     DT2     |   0   |
|   1/28   |     DT2     |   0   |
|   1/29   |     DT2     |   2   |
|----------|-------------|-------|

关于如何实现这一目标的任何线索?目前我有一个可笑的长脚本,只有在有人在场时才能获得设计团队的计数。如果那天没有人出现在那个团队中,我需要以某种方式获得一个连续计数的0。

一如既往地感谢你。

1 个答案:

答案 0 :(得分:4)

要获得零,需要一些技巧。您需要首先生成所有行(使用cross join),然后在出勤信息中生成left join

select d.date, dt.design_team, coalesce(ddt.cnt, 0) as cnt
from (select distinct design_team from member_info) dt cross join
     (select distinct date from attendance_history) d left outer join
     (select ah.date, mi.design_team, count(*) as cnt
      from attendance_history ah join
           member_info mi
           on ah.id = mi.id
      group by ah.date, mi.design_team
     ) ddt
     on ddt.design_team = dt.design_team and ddt.date = d.date;

编辑:修复了要加入的子查询啊.id = mi.id而不是ah.id = ah.id。