【问题标题】:MySQL - Select number of occurrences of values from another table (including zeros) [duplicate]MySQL - 从另一个表中选择值的出现次数(包括零)[重复]
【发布时间】:2016-08-19 16:03:18
【问题描述】:

我有两张桌子:

  • 第一个表 (names) 包含不同的名称,所有名称仅包含一次。
  • 第二张表 (people) 包含一些人的记录。此表中的所有名称(person 列)都包含在第一个表的 name 列中。

名字:

id    name
---   -----
1     Linda
2     John
3     Mary
4     Charles

人:

id    person
---   -----
1     John
2     Mary
3     Mary
4     Charles
5     Charles
6     Charles

SQL 小提琴:http://sqlfiddle.com/#!9/acaf4

我想列出人员表中名称值(包括零)的出现次数。

我使用了以下查询,但结果不包含零值:

SELECT person AS n,
   COUNT(person) AS name_occurrence
FROM people
LEFT JOIN names ON people.person = names.name
GROUP BY person
ORDER BY name_occurrence ASC;

结果是:

n         name_occurrence
-------   ---------------
John      1
Mary      2
Charles   3

我想要的是:

n         name_occurrence
-------   ---------------
Linda     0
John      1
Mary      2
Charles   3

【问题讨论】:

标签: mysql


【解决方案1】:

由于names 表包含所有已知名称,我认为您希望将LEFT JOIN 此表添加到包含people 表中出现的每个名称的计数的表中。如果名称没有出现在people 中,我使用COALESCE 将缺失的计数替换为零。

SELECT n.name,
       COALESCE(t.personCount, 0) AS personCount
FROM names n
LEFT JOIN
(
    SELECT person, COUNT(*) AS personCount
    FROM people
    GROUP BY person
) t
    ON n.name = t.person

点击下面的链接,使用@strawberry 所做的出色工作来制作令人愉快的小提琴:

SQLFiddle

【讨论】:

    【解决方案2】:

    如果您希望第一个表成为您的主记录,我认为您需要以其他方式进行连接。所以你可以从左到右改变连接

    【讨论】:

      猜你喜欢
      • 2022-10-18
      • 1970-01-01
      • 2016-06-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多