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 的组合。
我有一个 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 的组合。