2010-11-17 163 views
1

我有以下語句,它工作正常,除非事實上,如果第二個表沒有引用項目的第一個表,它將返回沒有結果。SQL查詢返回0而不是NULL

我需要的是它返回count(p.match_id) AS matchcount爲0

"SELECT c.*, count(p.match_id) AS matchcount 
    FROM ci_address_book c LEFT JOIN ci_matched_sanctions p 
    ON c.id = p.addressbook_id 
    GROUP BY p.addressbook_id ORDER BY c.id LIMIT ".$offset.",".$num; 

回答

1

首先這裏的問題是,您使用的是LEFT JOIN。這意味着c中的所有行將被返回,即使它們不匹配p中的行。

您的問題。

如果第二表沒有參考項目的第一個表,將不返回任何結果

讓我在我自己的話改寫本。

如果p表中沒有引用的項目到ç表也不會返回任何結果

當你做一個LEFT JOIN,在「右」表什麼是空將返回NULL的值。所以matchcount在這些情況下將會是「NULL」。 (你可以測試這個做select c.*, p.* ... where p.addressbook_id = NULL

顯示 「0」,而不是你做到以下幾點:

SELECT c.*, COALESCE(COUNT(p.match_id), 0) AS matchcount

COALESCE返回第一個非NULL值。因此,當COUNT(p.match_id)爲NULL時,您得到0.

+0

部分爲真...我的聲明{「SELECT c。*,COALESCE(COUNT(p.match_id),0)AS matchcount FROM ci_address_book c LEFT OUTER JOIN ci_matched_sanctions p ON c.id = p.addressbook_id GROUP BY p.addressbook_id ORDER BY c.id LIMIT「。$ offset。」,「。$ num;} ...這將只給我回數量的結果就像我在matching_sanctions表中一樣。我的通訊錄現在有80個名字。如果matched_sanctions根本沒有行,我什麼也得不到。如果它有1,我得到1,如果它有2我得到2等... – renevdkooi 2010-11-17 03:59:47

+0

也許換句話說我的q。我有一個名稱(地址簿)的表,我有一個表,其中包含匹配。由id引用。所以它是一個多關係。我想計算匹配表中的行數,同時獲取地址簿的所有結果。所以我想看到:addressbook_id:1 - name - count – renevdkooi 2010-11-17 04:02:00

+0

SELECT c。*,IFNULL(p.total,0)num FROM ci_address_book c LEFT JOIN(SELECT addressbook_id,COUNT(*)AS total FROM ci_matched_sanctions GROUP BY addressbook_id) AS p ON c.id = p.addressbook_id做了訣竅 – renevdkooi 2010-11-17 04:30:15