2010-07-12 106 views
2

我有2个表:MySQL的COUNT与非零项

表1.options_ethnicity带有以下各项:

ethnicity_id ethnicity_name 
1 White 
2 Hispanic 
3 African/American 

表2inquiries带有以下各项:

inquiry_id ethnicity_id 
1 1 
2 1 
3 1 
4 2 
5 2 

我想生成一个表,其中显示inqu数量由族裔ireless。我的查询到目前为止是这样的:

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 

查询给出了正确的答案,但有非洲/美国具有0的结果没有列。

White 3 
Hispanic 2 

如果我更换留下了右连接JOIN,我得到的所有3个种族名称,但对于非洲/美国计数是错误的。

White 3 
Hispanic 2 
African/American 1 

任何帮助,将不胜感激。

这里有一个更新这则讯息似乎是一个工作查询:

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 
+0

工作查询 - 将UNION更改为'UNION ALL' - 不删除重复项。 – 2010-07-13 00:18:54

+0

是的,你是对的。我已经将UNION更改为UNION ALL,这应该会更快。 – Mitchell 2010-07-13 13:11:23

回答

5

字符串,因为您使用的是LEFT JOIN ,对LEFT JOIN中定义的表的引用可以为空。你需要这意味着这个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 

这个例子使用COALESCE,处理NULL值的ANSI标准方法。它将返回第一个非空值,但如果找不到任何值,它将返回空值。 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 

这将皮卡的所有空ethncity_id实例,但它要归功于计数的“空占位符”组。 IE:

ethnicity_name | COUNT 
------------------------ 
White   | 3 
Hispanic   | 2 
NULL placeholder | ? 
+0

使用COALESCE绝对有效。我要去学习COALESCE。非常感谢OMG小马。 – Mitchell 2010-07-12 20:28:14

+0

在真实的数据库表中,查询表中有一些条目,其中的种族标识为NULL,即种族没有被记录。任何想法如何获得这些空值进行计数,以便它们可以显示? – Mitchell 2010-07-12 20:37:19

+0

@Mitchell:看到更新,让我知道如果这就是你以后。 – 2010-07-12 22:13:24

3

你算的,而不是右列

SELECT options_ethnicity.ethnicity_name, COUNT(inquiries.ethnicity_id) AS count 
FROM inquiries 
RIGHT JOIN options_ethnicity ON options_ethnicity.ethnicity_id = inquiries.ethnicity_id 
GROUP BY options_ethnicity.ethnicity_id 
0

为什么不“反转”您的查询?

SELECT 
    options_ethnicity.ethnicity_name, 
    COUNT(inquiries.ethnicity_id) AS count 
FROM 
    options_ethnicity 
    Left Join inquiries On options_ethnicity.ethnicity_id = inquiries.ethnicity_id 
GROUP BY 
    options_ethnicity.ethnicity_id 

你仍然可能需要合并的呼叫,但对我来说,这个查询更有意义的你要完成的任务。

+0

布兰登,谢谢你的回应。我相信你的“反向”查询在功能上与我原来的查询相同,但是“LEFT JOIN”替换为“RIGHT JOIN”,并且你正确的是合适的逻辑。仍然需要联盟才能有空的族裔类别报告0。 – Mitchell 2010-07-13 01:45:27