我有三张 table ;县、公墓和坟墓。 Graves 表中的 Marked 列是 bool 值。查询结果应包括每个墓地中“标记”坟墓的数量(包括零计数)。
County
-------------------------
| CountyID | Name |
-------------------------|
| 351 | Lee |
| 352 | Glascock |
-------------------------
Cemetery
--------------------------------------
| CEMID | CountyID | Name |
--------------------------------------|
| 1 | 352 | Smith Family |
| 2 | 352 | Adams Family |
| 3 | 352 | Jones Family |
| 4 | 351 | Harris Family |
--------------------------------------
Graves
--------------------------------------
| ID | CEMID | Name | Marked |
--------------------------------------|
| 1 | 1 | John Smith | Y |
| 2 | 1 | Mary Smith | N |
| 3 | 1 | Frank Smith | Y |
| 4 | 1 | Jane Smith | N |
| 5 | 2 | John Adams | Y |
| 6 | 2 | Ed Adams | N |
| 7 | 3 | Susan Jones | N |
--------------------------------------
Query Result
----------------------------------
| CEMID | Name | Count |
----------------------------------|
| 1 | Smith Family | 2 |
| 2 | Adams Family | 1 |
| 2 | Jones Family | 0 |
----------------------------------|
My current SELECT statement:
SELECT Cemetery.Name, Cemetery.CEMID, COUNT(Grave.Marked) AS Count
FROM Cemetery
JOIN County
ON Cemetery.CountyID = County.CountyID
JOIN Grave
ON Cemetery.CEMID = Grave.CEMID
WHERE CountyID = 352
AND Grave.Marked = TRUE
GROUP BY Cemetery.CEMID;
此语句返回结果,但不包括琼斯家族墓地,因为标记计数为零。我知道“Grave.Marked = TRUE”位于错误的位置,但我应该在哪里限定计数以包含标记计数为零的墓地。
最佳答案
您想要使用左连接
:
SELECT c.Name, c.CEMID, COUNT(g.Marked) AS Count
FROM Cemetery c LEFT JOIN
Grave g
ON c.CEMID = g.CEMID AND g.Marked = TRUE
WHERE c.CountyID = 352
GROUP BY c.CEMID;
对查询的更改:
- 不需要
county
表。您可以从cemetary
获取id。 连接
现在是左连接
。Marked
的条件已移至on
子句,而不是where
子句。- 使用表别名可以使查询更易于编写和读取。
关于mysql - 三个表的 JOIN 中的计数为零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28349377/