mysql - 三个表的 JOIN 中的计数为零

标签 mysql join count

我有三张 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/

相关文章:

php - 在 php mysql 查询中使用 session 变量

sql - 如何将 SQL 查询与不同的表达式结合起来?

Mysql 查询通过选择查询获取插入的用户名和更新的用户名?

python - 使用 Pandas 计算特定列中具有相同值的行

mysql - 如何计算连接表上的行数

MySQL:低基数/选择性列=如何索引?

php - 使用预定值(数据库)通过单击动态创建 <div> 或 <li> 项目

mysql - 将一列从一个表移动到另一个mysql

mysql - 按周分组,显示空周 - 带 where 子句

mysql - 选择另一个 ID 数量最多的 ID