我有2张桌子:
表1. options_ethnicity包含以下条目:
ethnicity_id ethnicity_name
1 White
2 Hispanic
3 African/American
Run Code Online (Sandbox Code Playgroud)
表2. inquiries包含以下条目:
inquiry_id ethnicity_id
1 1
2 1
3 1
4 2
5 2
Run Code Online (Sandbox Code Playgroud)
我想生成一个表格,显示按种族划分的查询次数.到目前为止,我的查询如下所示:
SELECT options_ethnicity.ethnicity_name, COUNT('inquiries.ethnicity_id') AS count
FROM (inquiries
LEFT JOIN options_ethnicity ON
options_ethnicity.ethnicity_id = inquiries.ethnicity_id)
GROUP BY options_ethnicity.ethnicity_id
Run Code Online (Sandbox Code Playgroud)
该查询给出了正确的答案,但没有非洲/美国的列有0个结果.
White 3
Hispanic 2
Run Code Online (Sandbox Code Playgroud)
如果我用右连接替换LEFT JOIN,我会获得所有3个种族名称,但非洲/美国人的数量是错误的.
White 3
Hispanic 2
African/American 1
Run Code Online (Sandbox Code Playgroud)
任何帮助,将不胜感激.
这是对这篇文章的更新,看起来似乎是一个有效的查询:
SELECT
options_ethnicity.ethnicity_name,
COALESCE(COUNT(inquiries.ethnicity_id), 0) AS count
FROM options_ethnicity LEFT JOIN inquiries ON inquiries.ethnicity_id = options_ethnicity.ethnicity_id
GROUP BY options_ethnicity.ethnicity_id
UNION ALL
SELECT
'NULL Placeholder' AS ethnicity_name,
COUNT(inquiries.inquiry_id) AS count
FROM inquiries
WHERE inquiries.ethnicity_id IS NULL
Run Code Online (Sandbox Code Playgroud)
因为您正在使用LEFT JOIN,所以对LEFT JOIN中定义的表的引用可以为null.这意味着您需要将此NULL值转换为零(在本例中):
SELECT oe.ethnicity_name,
COALESCE(COUNT(i.ethnicity_id), 0) AS count
FROM OPTIONS_ETHNICITY oe
LEFT JOIN INQUIRIES i ON i.ethnicity_id = oe.ethnicity_id
GROUP BY oe.ethnicity_id
Run Code Online (Sandbox Code Playgroud)
此示例使用COALESCE,ANSI标准处理NULL值的方法.它将返回第一个非null值,但如果找不到任何值,则返回null. IFNULL是MySQL的有效替代品,但它不能移植到其他数据库,而COALESCE则是.
在真实数据库表中,在查询表中有一些条目,其中ethnicity_id为NULL,即没有记录种族.有关如何计算这些空值以便显示它们的任何想法?
我想我理解你所面临的问题:
SELECT oe.ethnicity_name,
COALESCE(COUNT(i.ethnicity_id), 0) AS count
FROM (SELECT t.ethnicity_name,
t.ethnicity_id
FROM OPTIONS_ETHNICITY t
UNION ALL
SELECT 'NULL placeholder' AS ethnicity_name,
NULL AS ethnicity_id) oe
LEFT JOIN INQUIRIES i ON i.ethnicity_id = oe.ethnicity_id
GROUP BY oe.ethnicity_id
Run Code Online (Sandbox Code Playgroud)
这将拾取所有NULL ethncity_id实例,但它会将计数归因于"NULL占位符"组.IE:
ethnicity_name | COUNT
------------------------
White | 3
Hispanic | 2
NULL placeholder | ?
Run Code Online (Sandbox Code Playgroud)