外部联接 - >想要回报一些东西,即使是空的

时间:2014-09-15 10:46:30

标签: mysql sql

我尝试在2个表上返回group_concat 一个是我的学校名单,另一个是一些数字数据。

对于某些日期,我在SimpleData表中根本没有数据,因此我的lEFT OUTER JOINS返回10个结果,其中我有11所学校(我也需要11行javascript处理)

这是我的查询(告诉我是否需要提供有关表的更多详细信息

 SELECT A.nomEcole, 
    A.Compteur, 
    IFNULL(SUM(B.rendementJour), '0') AS TOTAL, 
    B.jourUS, 
    B.rendementJour
    FROM ecoles A LEFT OUTER JOIN SimpleData B ON A.Compteur = B.compteur
   WHERE jourUS LIKE '2013-07-%'
GROUP BY ecole

在这个例子中,我在本月的SimpleData中没有数据(根本没有记录数据)

我必须显示NULL或' 0'对于这所失踪的学校而言,我开始对一些简单的事情开始失去理智:(

感谢您的帮助!

奥利弗

3 个答案:

答案 0 :(得分:2)

@Abhik Chakraborty 提到了一种方法,其中将过滤掉与条件不符的记录,另一种方法是使用CASE语句

SELECT A.nomEcole, 
A.Compteur, 
SUM(CASE WHEN  jourUS LIKE '2013-07-%' THEN B.rendementJour ELSE 0 END) AS TOTAL, 
B.jourUS, 
B.rendementJour
FROM ecoles A 
LEFT OUTER JOIN SimpleData B ON A.Compteur = B.compteur
GROUP BY ecole

答案 1 :(得分:2)

我怀疑你只需要将where条件移到on子句:

SELECT A.nomEcole, A.Compteur, IFNULL(SUM(B.rendementJour), 0) AS TOTAL, 
       B.jourUS, B.rendementJour
FROM ecoles A LEFT OUTER JOIN
     SimpleData B
     ON A.Compteur = B.compteur and b.jourUS >= '2013-07-01' and b.jourUS < '2013-08-01'
GROUP BY A.ecole;

其他一些变化:

  • 不要对数字常量使用单引号。单引号实际上只应用于日期和字符串常量。
  • 请勿将like用于日期。 like是对字符串而不是日期的操作,日期必须隐式转换为字符串。相反,请直接比较您感兴趣的日期范围。
  • 我还建议表别名是您正在使用的表的缩写。这使查询更容易阅读。 (所以e代替A代替ecoles。)

另请注意,您为JourUSRendementJour返回的值不确定。如果B表中有多个匹配的行,则返回任意值。也许你想要max()group_concat()

答案 2 :(得分:0)

您的WHERE子句将LEFT OUTER JOIN转换为INNER JOIN,因为外连接记录值为NULL且NULL永远不会像LIKE&#39; 2013-07 - %&#39;。

这就是你必须将jourUS LIKE '2013-07-%'移到ON子句的原因,因为你只想加入jourus LIKE&#39; 2013-07 - %&#39;否则外连接空记录。