0

我有以下查询(通过 PHP 执行)。如果结果为 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
4

5 回答 5

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
;
于 2013-09-25T11:53:08.470 回答
0

COUNT() 永远不能返回 NULL。

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

  1. 您应该在此处查阅 MySQL 的 COUNT() 函数的文档。
  2. 您还应该考虑阅读Stack Overflow 上题为“can COUNT(*) ever return NULL”的文章。
  3. 或者这个题为“COUNT(*) 什么时候返回 NULL”
  4. 或者这个标题为“COUNT(*) 返回 NULL”
  5. 或者这个标题为“如果 COUNT(*) 为零则返回 NULL”
  6. 或者Oracle 论坛上题为“COUNT 永远不会返回 NULL”的这篇文章
于 2013-09-25T12:02:13.807 回答
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()格式化或以其他方式操作返回行的函数在哪里。

于 2013-09-24T21:09:18.203 回答
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 都会按照现在的方式拒绝您的查询(如果您打开更符合 ANSI 的模式,MySQL 也会拒绝)

于 2013-09-24T20:58:45.450 回答
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

只需更换

count(schicht)

COALESCE(count(schicht),0)
于 2016-10-02T20:16:45.787 回答