2011-11-01 266 views
0

我正在使用此查詢返回存儲在$ sTable中的歌曲列表以及存儲在$ sTable2中的總項目的COUNT。如何在MySQL中使用COUNT時返回0而不是null

/* 
    * SQL queries 
    * Get data to display 
    */ 
    $sQuery = " 
     SELECT SQL_CALC_FOUND_ROWS ".str_replace(" , ", " ", implode(", ", $aColumns))." 

    FROM $sTable b 
    LEFT JOIN (
    SELECT COUNT(*) AS projects_count, a.songs_id 

    FROM $sTable2 a 
    GROUP BY a.songs_id 
) bb ON bb.songs_id = b.songsID 


     $sWhere 
     $sOrder 
     $sLimit 
    "; 
    $rResult = mysql_query($sQuery, $gaSql['link']) or die(mysql_error()); 

「projects_count」在「$穩定」被放入一個數組與列一起,這然後通過JSON吐出來和頁面上顯示在表中。

這是工作完全從一首歌沒有任何項目鏈接到它。它當然返回NULL。

我希望所有的空值都返回爲'0'。

我已經試過了COUNT(),COUNT(IFNULL(PROJECT_ID,0),並使用COUNT(DISTINCT)...

並且: -

SELECT COALESCE(COUNT(*),0) AS projects_count, a.songs_id 

均無功而返

任何想法?

回答

5

使用COALESCE()功能。COALESCE()至少需要2個參數,以便計算,並返回第一個非空的說法。所以COALESCE(null, 0)將返回0,並且COALESCE(null, null, null, null, 1)將返回1。這裏的MySQL's documentationCOALESCE()

在重新閱讀您的查詢,您應該能夠得到你想要這樣的結果:

SELECT <all the fields you want>, b.songsID, COUNT(*) AS projects_count 
FROM $sTable b 
LEFT OUTER JOIN $sTable2 bb ON bb.songs_id = b.songsID 
$sWhere 
GROUP BY b.songsID 
$sOrder 
$sLimit 

就像我說的,這應該工作,但是一些事情並不感到相當對。

+0

感謝所有已經回答的人,但是沒有任何建議似乎給了我任何非null的東西,包括使用COALESCE。然而,這說,COALESCE對我來說是新的,我不確定在將它與COUNT(*)結合使用時適當的語法。如果你或許可以用我的代碼示例詳細說明,我將非常感激,因爲我的嘗試似乎仍然導致'null'。謝謝! – gordyr

+0

試試看我的編輯是否有效。 – Crontab

+0

可悲的是,它仍然沒有,儘管我很欣賞這種努力。儘管我討厭我可能不得不暫時放置一個jquery hack來替換null值直到找到解決方案。 :-( – gordyr

0
SELECT blahblahblah, IFNULL(bb.projects_count, 0) 
FROM $sTable b 
etc... 
1

COALESCE()返回第一個非空參數。所以,如果你說COALESCE(count(...),0)它將返回count(...)如果它不爲空,否則會返回0,如果count(...)是空

0

你不必做一個子查詢的連接。以下應該只是罰款不聚結等:

SELECT ".str_replace(" , ", " ", implode(", ", $aColumns)).", 
SUM(b.songsID is not null) as countprojects 
FROM $sTable b 
LEFT JOIN $sTable2 a ON a.songs_id=b.songsID 
GROUP BY ".str_replace(" , ", " ", implode(", ", $aColumns))." 

這將返回你問什麼在countprojects。

它的工作方式:LEFT JOIN只是確保您獲得所有數據。 您不能使用COUNT,因爲這將返回空行1。 但是,如果您只是使用布爾值TRUE計算結果爲1的事實,而 布爾值FALSE計算結果爲0,那麼您可以在這些結果上使用SUM

+0

儘管這看起來像是一個更好的解決方案,但它並不適合我,而且我對MySQL的經驗不足使我無法調整您的示例代碼,以便與其他人一起正常工作。我想我們肯定會越來越接近 – gordyr

+0

你介意打印我的查詢和粘貼的結果嗎 – Eljakim

+0

它爲我拋出一個JSON格式錯誤......在我的應用程序中, m不知道實際查詢結果將會有多大用處,但它們是:.str_replace(;「\t \t」implode(「;」\t $ aColumns))。「;」5059「\t 如果這不是你以後我真誠地道歉,正如我所說的,我對MySQL非常陌生,並且會調試查詢的方法。如果能夠幫助我粘貼整個PHP文件(它不是那麼長),我用來執行查詢並返回JSON? – gordyr