2010-11-17 160 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