如何使LEFT JOIN与MySQL中的分组/计数一起工作?

时间:2009-10-01 17:17:48

标签: mysql join count group-by

我有这样的查询:

SELECT type.id, type.name, COUNT(*) AS tot
FROM page
LEFT JOIN type ON page.type=type.id
GROUP BY type.id

但是,这并没有选择所有类型:它会遗漏任何不在页面表中的类型。我只是希望它列出每个类型的数字,表示有多少页面具有该类型,包括0,其中类型不会发生。我需要一个不同的加入吗?

3 个答案:

答案 0 :(得分:3)

改为RIGHT JOIN。试试这个:

SELECT type.id, type.name, COUNT(page.type) AS tot
FROM page
RIGHT JOIN type ON page.type=type.id
GROUP BY type.id

请注意不同的计数方式。对于没有的类型,page.type将为NULL 页面。执行COUNT

时,将忽略此类行

[编辑]这是一个例子。如果我们有以下数据:

  type
id  name
 1     A
 2     B
 3     C

  page
id   type
 1     1
 2     1
 3     2

如果我们在答案(JOINGROUP BY)中执行COUNT,我们的结果集将如下所示:

type.id  type.name  page.id  page.type
      1          A        1          1
      1          A        2          1
      2          B        3          2
      3          C     NULL       NULL

现在,当我们执行GROUP BYCOUNT(type.id)时,我们正在计算行数 其中type.id不为NULL。这将是所有行:结果是A为2 B和C为1。

如果我们改为COUNT(page.type),我们得到2为A,1为B,0为C(因为 对于C,page.typeNULL。)

答案 1 :(得分:2)

左连接会从连接表达式左侧的表中返回所有行,无论它们是否存在于右侧的表中,请尝试此操作(切换表达式的边):

SELECT type.id, type.name, COUNT(*) AS tot
FROM  type 
LEFT JOIN  page ON type.id=page.type
GROUP BY type.id, type.name

答案 2 :(得分:0)

USE Coalesce为GROUP BY提供NULL值

SELECT
    COALESCE(type.id, 0),
    COALESCE(type.name, 'NoType'),
    COUNT(*) AS tot
FROM
    page
LEFT JOIN
    type
ON
    page.type=type.id
GROUP BY
    COALESCE(type.id, 0),
    COALESCE(type.name, 'NoType')