2013-09-24 220 views
0

我有以下查询(通过PHP执行)。如果结果为NULL并且没有显示,我怎样才能让它显示ZERO。显示零如果SQL计数为NULL

select count(schicht) as front_lcfruh, 
     kw, 
     datum 
from dienstplan 
    left join codes on dienstplan.schicht = codes.lcfruh 
    left join personal on personal.perso_id = dienstplan.perso_id 
where codes.lcfruh != '' 
and personal.status = 'rezeption' 
and dienstplan.kw = '$kw' 
group by dienstplan.datum 
+0

使用is_null或===运营商更换

count(schicht) 

。 'is_null($ result ['column'])' '$ result ['column'] === NULL' –

+4

尽我所知(至少在Oracle中)'count'不能返回null。 – gdoron

+0

schicht来自dienstplan,如果结果为NULL意味着没有匹配的行 – user2615859

回答

0

我不能完全肯定我理解的问题,但我想你想的:

select count(codes.lcfruh) as front_lcfruh, 
     dienstplan.kw, 
     dienstplan.datum 
from dienstplan 
    left join codes on dienstplan.schicht = codes.lcfruh and codes.lcfruh <> '' 
    left join personal on personal.perso_id = dienstplan.perso_id 
and personal.status = 'rezeption' 
and dienstplan.kw = $kw 
group by dienstplan.datum, dienstplan.kw 

如果schicht来自dienstplan总是会有为该行(因为这是驾驶台)。如果我的理解正确,如果找不到匹配的行,则需要0。因此,您需要计算加入表的

编辑:
条件where codes.lcfruh != ''转动外连接回内部联接,因为任何“外”行将具有lcfruh为NULL,并用NULL产量“未知”和为此的行从最终结果除去任何比较。如果要排除codes表中lcfruh空字符串的行,则需要将该条件移入JOIN子句(请参见上文)。

另外还有两件事:习惯在具有多个表的查询中为列加前缀。这样可以避免含糊不清,并使查询对变更更加稳定。您还应该了解数字文字与字符串文字的区别1是一个数字'1'是一个字符串。在预期数字的地方使用字符串文字是一种坏习惯。 MySQL非常宽容,因为它总是试图“以某种方式”工作,但如果你曾经使用其他DBMS,你可能会遇到你不明白的错误。

此外,您使用group by是错误的,并会导致返回“随机”值。请参阅这些博客文章理解为什么:

每隔DBMS将拒绝您的查询,现在写入的方式(和MySQL会,以及在万一你打开更符合ANSI模式)

+0

,但我仍然不是获得ZERO – user2615859

+0

@ user2615859然后你需要提供更多的细节。你能在http://sqlfiddle.com上设置一个小例子吗? –

+0

对不起,我从来没有用过它。我虽然这可能很简单。我需要列出数据,代码中有dienstplan.kw ='$ kw',这是一年中的一周,它有七组数据(7天)。如果COUNT为0或更大,我需要每天计算schicht的数量。希望这可以帮助。 – user2615859

0

如果没有匹配的行,那么MySQL将返回一个空集(这里我已经定义了随机的字段,只运行查询):

mysql> CREATE TABLE dienstplan (kw varchar(10), datum integer, schicht integer, perso_id integer); 
Query OK, 0 rows affected (0.00 sec) 

mysql> CREATE TABLE codes (lcfruh varchar(2)); 
Query OK, 0 rows affected (0.00 sec) 

mysql> CREATE TABLE personal (perso_id integer, status varchar(5)); 
Query OK, 0 rows affected (0.00 sec) 

mysql> 
mysql> select count(schicht) as front_lcfruh, 
    ->  kw, 
    ->  datum 
    -> from dienstplan 
    -> left join codes on dienstplan.schicht = codes.lcfruh 
    -> left join personal on personal.perso_id = dienstplan.perso_id 
    -> where codes.lcfruh != '' 
    -> and personal.status = 'rezeption' 
    -> and dienstplan.kw = '$kw' 
    -> group by dienstplan.datum; 

Empty set (0.00 sec) 

您可以检查查询返回的行数。在这种情况下,你会得到零。

所以,你可以修改你的代码是这样的(伪代码):

$exec = $db->execute($query); 
if ($exec->error() !== false) { 
    // Handle errors. Possibly quit or raise an exception. 
} 
if (0 == $exec->count()) 
{ 
    // No rows. We return a default tuple 
    $tuple = array(
     'front_lcfruh' => 0, 
     'kw'   => $kw, 
     'datum'  => null 
    ); 
    handleTuple($tuple); 
} else { 
    while($tuple = $exec->fetch()) { 
     handleTuple($tuple); 
    } 
} 

哪里handleTuple()是格式化功能或以其他方式操纵返回的行。

0
SELECT dp.datum 
     , MIN(kw) -- To avoid adding it to GROUP BY clause 
     , count(schicht) AS front_lcfruh 
FROM dienstplan dp 
LEFT JOIN codes co ON dp.schicht = co.lcfruh 
LEFT JOIN personal pe ON pe.perso_id = dp.perso_id 
WHERE dp.kw = '$kw' 
AND COALESCE(co.lcfruh, 'X') <> '' -- Handle NULLs, too 
AND COALESCE(pe.status , 'rezeption') = 'rezeption' -- Handle NULLs, too 
GROUP BY dp.datum 
; 
0

COUNT()永远不会返回NULL。

Lorenzo说(见评论),我应该提供参考来帮助SO社区。根据这些反馈,我在下面编辑了我的答案。

  1. 您应该查阅MySQL here的COUNT()函数的文档。
  2. 你也应该考虑阅读这篇文章at Stack Overflow题为“可以COUNT(*)永远返回NULL”。
  3. 或者this one题为 “什么时候COUNT(*)返回NULL”
  4. 或者this one题为 “COUNT(*)返回NULL”
  5. 或者this one题为 “返回NULL COUNT(*)为零”
  6. 或在Oracle论坛上标题为“COUNT never never NULL?”的this article
+0

请提高答案的质量,添加更多的上下文和参考。 –

+0

Lorenzo;我不清楚你希望我补充什么样的背景。 COUNT是一个SQL函数,它总是返回一个数字,从不为NULL。这在大多数数据库文档中都有记录。我假设问这个问题的人至少读了这个。它也在大多数数据库1xx级课程中(是的,我教过数据库课程)。 我很乐意提高我的答案的质量,但会喜欢你正在寻找的一些方向。 – amrith

+0

请记住,这里关于SO的重点不在于满足OP的需求,而在于社区的需求,这意味着拥有最好的问答网站。您的答案对于OP来说可能是完美的,但是SO标准太短了。看到这个[meta SO](http://meta.stackexchange.com/questions/138738/should-i-give-short-answers-or-comments)线程。 –

0
select COALESCE(count(schicht),0) as front_lcfruh,kw,datum 
from dienstplan 
    left join codes on dienstplan.schicht = codes.lcfruh 
    left join personal on personal.perso_id = dienstplan.perso_id 
where codes.lcfruh != '' 
and personal.status = 'rezeption' 
and dienstplan.kw = '$kw' 
group by dienstplan.datum 

只是

COALESCE(count(schicht),0)