【问题标题】:MySQL COUNT() to return 0MySQL COUNT() 返回 0
【发布时间】:2013-08-12 21:53:23
【问题描述】:

我的查询如下所示:

SELECT
  app.application_id,
  j.job_number,
  j.job_id,
  j.job_title,
  j.job_city,
  j.job_state,
  p.person_id  AS candidate_id,
  p.first_name,
  p.last_name,
  app.start_date,
  ope1.percent_complete,
  MAX(CASE
      WHEN r.role_display_name = 'ENG - Recruiter' THEN
        (SELECT CASE WHEN COUNT(last_name) = 0 THEN
                   'Unassigned'
                 ELSE
                   COUNT(last_name)
                 END AS uname
           FROM users
           JOIN job_roles ON job_roles.user_id = users.user_id
          WHERE job_id = j.job_id
            AND role_id = r.role_id
        )
      ELSE '' END) AS role_3

我的问题是COUNT(last_name)不会返回0,因为没有返回记录,所以没有NULL的值。一切都说得通,但是我尝试将其包装在IFNULL()ISNULL() 中,但似乎都没有解决这个问题。没有记录时如何让它返回 0? COUNT() 聚合中是否需要另一个子查询?我真的不想使用另一个子查询....

【问题讨论】:

  • 这行不通。您正在尝试在子选择的行上下文中使用聚合函数的结果。直到扫描整个表之后,COUNT() 结果才可用
  • 如果您使用 php 处理内容,您可以作弊并使用if (!$lname_count) $lname_count = 0;
  • @MarcB 那么我如何检查是否存在符合该条件的记录?
  • 您的完整查询是什么?您有聚合但没有 group byfrom 语句。另外,你能更好地格式化你的查询吗?

标签: mysql sql count null


【解决方案1】:

如果正确理解你想要什么,你可以尝试用这种方式重写它

SELECT ...
      ,MAX(CASE WHEN r.role_display_name = 'ENG - Recruiter' 
                THEN COALESCE(NULLIF(
                (
                     SELECT COUNT(last_name) 
                       FROM users JOIN job_roles 
                         ON job_roles.user_id = users.user_id 
                      WHERE job_id = j.job_id 
                        AND role_id = r.role_id
                 ), 0), 'Unassigned')
                ELSE ''
           END) as role_3
       ...

【讨论】:

  • 在这种情况下,COUNT(last_name) 只能在存在匹配项时返回 0,并且在所有匹配项中,last_name 列都没有值(包含 NULL)。我认为 OP 更有可能只需要使用左连接而不是内部连接。除此之外,您在这里使用 NULLIF() 非常简洁。
猜你喜欢
  • 2011-04-05
  • 2020-12-22
  • 2020-10-05
  • 2012-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-20
  • 1970-01-01
相关资源
最近更新 更多