2014-01-28 83 views
1

我一直盯着這麼多的SQL代碼,我的大腦實際上很糟糕。MySQL連接和計數用零查詢

我會快點的。下面是我的表結構,省略了不相關的列:

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的連續數。

謝謝,一如既往。

回答

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; 

編輯:固定子查詢的加入對ah.id = mi.id代替ah.id的= ah.id.

+0

感謝您的快速響應!我從來沒有聽說過交叉加入。我一定會在今晚檢查代碼並確保它正常工作! –