MySQL - 从另一个表中选择值的出现次数(包括零)

时间:2016-08-19 16:03:19

标签: mysql

我有两张桌子:

  • 第一个表(名称)包含不同的名称,所有名称只包含一次。
  • 第二个表()包含一些人的记录。此表中的所有名称( 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

2 个答案:

答案 0 :(得分:3)

由于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

答案 1 :(得分:0)

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