2013-09-24 223 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)