代码之家  ›  专栏  ›  技术社区  ›  Carson Myers

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

  •  4
  • Carson Myers  · 技术社区  · 15 年前

    我正在尝试使用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 回复  |  直到 15 年前
        1
  •  4
  •   Rob Farley    15 年前

    在我看来,你好像想进行分组,但只需计算一下已批准的分组。

    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;
    
        2
  •  1
  •   Alex Gaynor    15 年前

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

        3
  •  1
  •   Nathan Wheeler    15 年前

    您正在使用此方法执行两个非常独特的操作,我不鼓励使用这种查询。要做到这一点,完全正确的方法是将其分成两个单独的查询,并分别运行它们。

    如果需要,只需运行第二个不带计数的查询,然后获取在应用程序级别返回的行的计数,这是可以接受的,并且如果不返回任何行,该计数将等于0。

        4
  •  1
  •   Carl Manaster    15 年前

    你不能用这个查询“只得到零”,因为你是在请求一行。在第一个查询中,您请求的是一个元素行,其中元素是计数,它总是返回一个数字。但是在第二种情况下,您需要一行,当不存在这样的行时,返回没有行是正确的事情。

        5
  •  1
  •   Wim    15 年前

    第二个查询为每个唯一的 (first_name, last_name, email) 发生。如果根本没有记录,就没有 (名字、姓氏、电子邮件) 组合,没有结果行,没有计数(*)值…

        6
  •  0
  •   Community Michael Schmitz    7 年前

    回顾 Tony Andrew's answer to another question 看看他是怎么做到的 UNION 使用条件select语句来获取所需的行为。

        7
  •  -1
  •   Davy    15 年前

    尝试使用isNull(名为“”)作为列的空值,这样它们就不会被Rutburned。