MySQL在多对多的关系中包括0

时间:2015-02-24 18:24:44

标签: mysql aggregate-functions

我有一张区域表,其中包含ID,噪音级别表以及记录具有区域ID和噪音级别的条目的表格。我希望能够获得能够返回所有区域噪声水平的信息,即使某个区域从未被记录为噪声级别。

区域:

|spaceid|     name|
-------------------
|      1|1st floor|
|      2|2nd floor|
|      3|3rd floor|

噪音等级:

|noiseid| label|
----------------
|      1|Quiet |
|      2|Medium|
|      3|Loud  |

关系:

记录:

|spaceid|noiseid|
-----------------
|      1|      1|
|      2|      1|
|      3|      1|
|      1|      1|
|      2|      2|
|      3|      2|
|      1|      3|
|      2|      3|
|      3|      3|

查询

SELECT
    records.spaceid, noise.label, count(records.spaceid)
FROM
    noise
LEFT JOIN
    records on noise.noiseid = records.noiseid
GROUP BY
    records.spaceid,
    noise.noiseid

预期结果:

|records.spaceid|noise.label|count(records.spaceid)|
----------------------------------------------------
|              1|      Quiet|                     2|
|              1|     Medium|                     0|
|              1|       Loud|                     1|
|              2|      Quiet|                     1|
|              2|     Medium|                     1|
|              2|       Loud|                     1|
|              3|      Quiet|                     1|
|              3|     Medium|                     1|
|              3|       Loud|                     1|

实际结果

|records.spaceid|noise.label|count(records.spaceid)|
----------------------------------------------------
|              1|      Quiet|                     2|
|              1|       Loud|                     1|
|              2|      Quiet|                     1|
|              2|     Medium|                     1|
|              2|       Loud|                     1|
|              3|      Quiet|                     1|
|              3|     Medium|                     1|
|              3|       Loud|                     1|

1 个答案:

答案 0 :(得分:2)

一种可能的方法:

SELECT spaces.spaceid, noises.label, COUNT(records.spaceid)
FROM noises JOIN spaces
LEFT JOIN records 
  ON noises.noiseid = records.noiseid 
     AND spaces.spaceid = records.spaceid
GROUP BY spaces.spaceid, noises.noiseid

Demo。这里的关键是在两个条件下进行LEFT JOIN,而不仅仅是一个 - spaceid和noiseid的组合。