我有一张区域表,其中包含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|
答案 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的组合。