选择COUNT(*)有时会返回0,有时不返回任何内容

时间:2010-01-18 22:01:02

标签: sql count

我正在尝试使用SELECT COUNT(*)查找数据库中不同内容的数量。问题是当零 -

例如,

SELECT COUNT(*) FROM `images` WHERE `approved` = '1'

如果没有结果,我仍然会返回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?

7 个答案:

答案 0 :(得分: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 :(得分:1)

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

答案 2 :(得分:1)

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

如果需要,您可以简单地运行第二个查询而不计算,然后获取应用程序级别返回的行数,这是可以接受的,并且该计数将等于0,其中没有行返回。

答案 3 :(得分:1)

你不能用该查询“只获得零”,因为你要求它为一行。在第一个查询中,您要求的是一个单元素行,其中元素是计数 - 并且始终返回一个数字。但是在第二行中,你要求一行,当没有这样的行时,不返回任何行是正确的。

答案 4 :(得分:1)

第二个查询为每个(first_name, last_name, email)次出现的唯一一组提供了一个结果行。如果根本没有记录,则没有(first_name, last_name, email)组合,没有结果行,也没有COUNT(*)值......

答案 5 :(得分:0)

审核Tony Andrew's answer to another question并查看他如何使用条件选择语句执行UNION以获得所需的行为。

答案 6 :(得分:-1)

尝试使用IsNull(first_name,''),就好像列为空,它们不会被篡改。