即使查询为NULL,如何返回所有行

时间:2014-10-30 21:25:08

标签: mysql join null

我有以下代码:

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,但我遇到了问题 - 我认为这是因为我使用的是子查询。任何和所有建议都欢迎。

3 个答案:

答案 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