我有这样的查询:
SELECT type.id, type.name, COUNT(*) AS tot
FROM page
LEFT JOIN type ON page.type=type.id
GROUP BY type.id
但是,这并没有选择所有类型:它会遗漏任何不在页面表中的类型。我只是希望它列出每个类型的数字,表示有多少页面具有该类型,包括0,其中类型不会发生。我需要一个不同的加入吗?
答案 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
如果我们在答案(JOIN
或GROUP 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 BY
和COUNT(type.id)
时,我们正在计算行数
其中type.id不为NULL。这将是所有行:结果是A为2
B和C为1。
如果我们改为COUNT(page.type)
,我们得到2为A,1为B,0为C(因为
对于C,page.type
为NULL
。)
答案 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')