2013-09-24 5 views
0

У меня есть следующий запрос (выполняется через PHP). Как я могу заставить его показывать ZERO, если результат NULL и не показан.показ Zero, если sql count 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 или === оператора. '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, если соответствующие строки не найдены. Для этого вам необходимо учитывать присоединился к table.

Редактировать:
условие where codes.lcfruh != '' поворачивает внешнее соединение обратно в внутреннее соединение, так как любой «внешний» строка будет иметь lcfruh как NULL и ни в какое сравнение с NULL выходами «неизвестно», и для этого строки будут удалены из конечного результата , Если вы хотите исключить строки в таблице codes, где lcfruh имеет пустую строку, вам необходимо переместить это условие в предложение JOIN (см. Выше).

И еще две вещи: привыкнуть к префиксам столбцов в запросе с более чем одной таблицей. Это позволяет избежать двусмысленности и делает запрос более устойчивым к изменениям. Вы также должны понимать разницу между литералами чисел и строковыми литералами. 1 - это номер '1' - это строка. Плохая привычка использовать строковые литералы, где ожидаются числа. MySQL довольно прощает, поскольку он всегда пытается «как-то» работать, но если вы когда-либо пользовались другими СУБД, вы могли бы получить ошибки, которые не понимаете.

Кроме того, неправильное использование вами group by приведет к возврату случайных данных. Пожалуйста, смотрите эти сообщения в блоге, чтобы понять, почему:

Все остальные СУБД отклонит ваш запрос так, как это написано сейчас (и MySQL будет, а в случае, если вы включите более ANSI-совместимый режим)

+0

, но я все еще не получение ZERO, перечисленных – user2615859

+0

@ user2615859 Затем вам нужно будет предоставить более подробную информацию. Можете ли вы настроить небольшой пример на http://sqlfiddle.com? –

+0

Извините, я никогда не использовал его. хотя это может быть просто. Мне нужно перечислить данные, в коде есть dienstplan.kw = '$ kw', то есть неделя года, у него семь наборов данных (7 дней). Мне нужно, чтобы счетчик schicht каждого дня, тем не менее, если COUNT равно 0 или больше. надеюсь это поможет. – 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.

Лоренцо сказал (см. Комментарии), что я должен предоставить ссылки, чтобы помочь сообществу SO. Основываясь на этой обратной связи, я отредактировал свой ответ ниже.

  1. Вы должны ознакомиться с документацией функции COUNT() для MySQL here.
  2. Вы также должны рассмотреть возможность чтения этой статьи at Stack Overflow, озаглавленной «can COUNT (*) когда-либо возвращать NULL».
  3. Или this one под названием "Когда же COUNT (*) возвращение NULL"
  4. Или this one под названием "COUNT (*) возвращает NULL"
  5. Или this one под названием "Возвращение NULL, если COUNT (*) равна нулю"
  6. Или this article на форумах Oracle под названием «COUNT никогда не возвращает NULL?»
+0

Пожалуйста, улучшите качество ответа, добавив больше контекста и ссылок. –

+0

Lorenzo; Я не понимаю, какой контекст вы хотели бы мне добавить. COUNT - это функция SQL, и она всегда возвращает число, а не NULL. Это описано в большинстве документации по базам данных. Я предполагаю, что человек, задающий вопрос, по крайней мере прочитал это. Это также в большинстве базовых курсов 1xx (да, я преподавал курсы баз данных). Я рад улучшить качество своего ответа, но мне понравилось бы то, что вы ищете. – amrith

+0

Пожалуйста, помните, что основной упор здесь на SO не на удовлетворение потребностей OP, а на потребности сообщества, что означает наличие лучшего сайта Q & A. Ваш ответ может быть идеальным для 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 

просто заменить

count(schicht) 

с

COALESCE(count(schicht),0)