6

我有一个表,其中一个字段包含一个整数或NULL.

parent_id
2
4
6
NULL
NULL
45
2

我将如何添加一个 IFNULL 语句,以便ans_count填充0而不是NULL

这是我的 SQL 代码:

...
(SELECT parent_id AS pid, COUNT(*) AS ans_count
   FROM qa
  GROUP BY parent_id) AS n

更新

下面是完整的 SQL - 感谢大家的耐心等待。

SELECT  *
FROM    qa
        JOIN user_profiles
          ON user_id = author_id
        LEFT JOIN (SELECT cm_id,
                          cm_author_id,
                          id_fk,
                          cm_text,
                          cm_timestamp,
                          first_name AS cm_first_name,
                          last_name AS cm_last_name,
                          facebook_id AS cm_fb_id,
                          picture AS cm_picture
                    FROM  cm
                    JOIN  user_profiles
                      ON  user_id = cm_author_id) AS c
          ON id = c.id_fk
        LEFT JOIN (SELECT   parent_id AS pid, COUNT(*) AS ans_count
                     FROM   qa
                    GROUP   BY parent_id) AS n
          ON id = n.pid
WHERE   id  LIKE '%'
ORDER   BY id DESC
4

6 回答 6

13

编辑:基于完整查询的新信息

在您指定的查询中计数可以为空的原因是左连接将在不匹配的记录上返回空值。所以子查询本身没有返回空计数(因此所有的响应和混乱)。需要在最外层的select中指定IFNULL,如下:

SELECT  qa.*, user_profiles.*, c.*, n.pid, ifnull(n.ans_count, 0) as ans_count
FROM    qa
        JOIN user_profiles
          ON user_id = author_id
        LEFT JOIN (SELECT cm_id,
                          cm_author_id,
                          id_fk,
                          cm_text,
                          cm_timestamp,
                          first_name AS cm_first_name,
                          last_name AS cm_last_name,
                          facebook_id AS cm_fb_id,
                          picture AS cm_picture
                    FROM  cm
                    JOIN  user_profiles
                      ON  user_id = cm_author_id) AS c
          ON id = c.id_fk
        LEFT JOIN (SELECT   parent_id AS pid, COUNT(*) AS ans_count
                     FROM   qa
                    GROUP   BY parent_id) AS n
          ON id = n.pid
WHERE   id  LIKE '%'
ORDER   BY id DESC

旧回应

你能更详细地解释你所看到的和你期望看到的吗?Count 不能返回 NULL。

运行这组查询,您将看到计数始终为 2。您可以更改 NULL parent_id 的显示方式(为 NULL 或 0),但计数本身将始终返回。

create temporary table if not exists SO_Test(
    parent_id int null);

insert into SO_Test(parent_id)
select 2 union all select 4 union all select 6 union all select null union all select null union all select 45 union all select 2;


SELECT IFNULL(parent_id, 0) AS pid, COUNT(*) AS ans_count
   FROM SO_Test
  GROUP BY IFNULL(parent_id, 0);

SELECT parent_id AS pid, COUNT(*) AS ans_count
   FROM SO_Test
  GROUP BY parent_id;

drop table SO_Test;
于 2011-07-25T03:46:12.510 回答
2

我没有对此进行测试,但我认为它会起作用

(SELECT IF( parent_id IS NULL, 0, parent_id) AS pid, COUNT(*) AS ans_count
   FROM qa
  GROUP BY parent_id) AS n
于 2011-07-25T03:12:43.090 回答
1

只需将其包裹在您的陈述中:

IFNULL( 
  (SELECT parent_id AS pid, COUNT(*) AS ans_count
   FROM qa
   GROUP BY parent_id)
 , 0
) AS n
于 2011-07-25T03:13:08.073 回答
1

您可以发布显示您正在谈论的行为的实际数据和完整查询吗?以我的经验,COUNT(*)永远不能为NULL。

Count(*) 可以返回 null 吗?

COUNT(*) 是否总是返回结果?

于 2011-07-25T03:15:05.433 回答
1

您是否尝试过仅计算 parent_id 的数量?

(SELECT parent_id AS pid, COUNT(parent_id) AS ans_count
   FROM qa
  GROUP BY parent_id)
于 2011-07-25T03:50:52.313 回答
1
SELECT IFNULL(parent_id, 0) AS pid, COUNT(IFNULL(parent_id, 0)) AS ans_count
FROM qa
GROUP BY IFNULL(parent_id, 0)
于 2011-07-25T05:03:05.403 回答