我有以下代码:
SELECT t1.location as Locations,
COUNT( t1.location ) AS Total,
tab.Responses, tab.location as tablocation
FROM `trespondent` t1
JOIN
( SELECT location, COUNT( location ) AS Responses FROM `trespondent`
WHERE completion_status IN ('Started', 'Complete') GROUP BY location )
tab ON t1.location = tab.location GROUP BY t1.location
这个输出是:
Locations Total Responses tablocation
Berlin 57 43 Berlin
New York 132 118 New York
哪个好。但是,我有另一个地点'在数据库(巴黎)中,总共有55个,但对于答案的结果为0(即WHERE completion_status IN ('Started', 'Complete'
)。
我理想的输出是:
Locations Total Responses tablocation
Berlin 57 43 Berlin
New York 132 118 New York
Paris 55 0 Paris
然而,我正在努力,因为我不能让MySQL返回该行,因为该语句产生了一个“空”'结果
我尝试使用UNION
,但我遇到了问题 - 我认为这是因为我使用的是子查询。任何和所有建议都欢迎。
答案 0 :(得分:1)
使用LEFT JOIN
代替INNER JOIN
以及COALESCE()
功能,如下所示
SELECT t1.location as Locations,
COUNT( t1.location ) AS Total,
COALESCE(tab.Responses, 0),
COALESCE(tab.location, t1.location) as tablocation
FROM `trespondent` t1
LEFT JOIN
( SELECT location,
COUNT( location ) AS Responses
FROM `trespondent`
WHERE completion_status IN ('Started', 'Complete')
GROUP BY location
) tab ON t1.location = tab.location
GROUP BY t1.location
答案 1 :(得分:0)
尝试在SELECT中添加LEFT OUTER JOIN以获得值null,换句话说,如果从select中没有得到任何值(如Paris),那么对于SELECT的那部分,你要LEFT OUTER JOIN而不是其他类型的加入。
有关详细信息,请参阅:http://dev.mysql.com/doc/refman/5.0/en/join.html
再见
答案 2 :(得分:0)
修复代码的最直接方法可能是LEFT JOIN
到子查询,并使用COALESCE(tab.Responses, 0)
来处理空值。
然而,它是一个写得不好的查询,还有其他一些你应该修复的问题。例如,这实际上是一种自我加入,你强加t1.location = tab.location
的条件 - 没有必要单独返回两列,因为它们总是是相同。
(自我加入的一个有趣含义:如果location
不是表格中的唯一键,那么您可以在该列中使用空值;使用您已使用的条件进行内部连接将消除这些结果集中的行,因为连接条件为null = null
which is not considered true。)
此外,您还要将同一列分组两次。这是一个强有力的信号,表明您的查询可能更简单。试试这个,然后比较结果(更重要的是,使用EXPLAIN
比较执行计划):
SELECT
location,
COUNT(*) AS total,
SUM(completion_status IN ('Started', 'Complete')) AS responses
FROM
trespondent
GROUP BY location;
如果您需要处理responses
列中的空值,可以按照上面的建议将其包含在COALESCE
中,或者使用the MySQL-specific function IFNULL
。