2010-01-18 72 views
4

我试图使用SELECT COUNT(*)来查找数据库中不同事物的数量。问题是,当存在零 -选择COUNT(*)有时返回0,有时不返回任何内容

例如,

​​

如果没有结果,我仍然会得到一个0回来,可以检查$result['COUNT(*)']

但与此查询,

SELECT COUNT(*) , `first_name` , `last_name` , `email` 
FROM `images` 
WHERE `approved` = '0' 
AND (
    `first_name` = '' 
    AND `last_name` = '' 
    AND `email` = '' 
) 
GROUP BY `first_name` , `last_name` , `email` 

我刚刚得到一个空的结果集。
如何在没有结果的情况下使用此查询得到0?

+1

解决此问题的更好方法是处理处理查询的代码中的两种情况。 – ZoogieZork 2010-01-18 22:05:57

回答

4

这听起来像你想要做的分组,但只是计数那些被批准的。

SELECT COUNT(CASE WHEN approved = '0' THEN 1 END) AS Cnt, 
     first_name , last_name , email 
FROM images 
GROUP BY first_name , last_name , email; 
1

原因是第一个是简单的聚合查询,它返回一个单一的序数值。第二个查询是按查询分组,它返回一行结果的元组。由于查询具有不同的返回类型,因此它们具有不同的空值。

+2

零不是一个真正的空值;它是空集合中的行数。 – 2010-01-18 22:06:33

-1

尝试使用IsNull(first_name,''),就好像列中有null一样,它们不会被忽略。

1

您正在使用此方法执行两个非常独特的操作,并且我会阻止这种查询。完全正确的方法是将它分成两个单独的查询,并分别运行它们。

如果您愿意,您可以简单地运行第二个查询WITHOUT计数,然后获得在应用程序级别返回的行的计数,这是可以接受的,并且THAT计数将等于0,其中没有行返回。

1

你不能“只是得到一个零”与该查询,因为你问它的行。在第一个查询中,您要求提供一个元素的行,其中元素是计数 - 并且总是返回一个数字。但在第二个问题中,您需要一个行,当没有这样的行存在时,不返回行是正确的。

1

第二个查询为每个唯一的一组(first_name, last_name, email)事件提供了一个结果行。如果没有记录可言,没有(first_name, last_name, email)组合,没有结果行,并没有COUNT(*)值...