MySQL 在多对多关系中包含 0

MySQL Include 0 in count many to many relationship

我有一个 table 有 ID 的区域,一个 table 的噪音水平,还有一个 table 记录了同时有区域 ID 和噪音水平。我希望能够实现 return 所有区域噪音水平的计数,即使某个区域从未被记录为该噪音水平。

地区:

|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|

一种可能的方法:

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 的组合。