如何显示所有 Case When Then 记录,即使 MySQL 中为 NULL

How to show all Case When Then records even if NULL in MySQL

我必须显示有多少用户投票给 2,但按年龄范围分开。

我当前的查询工作正常;但是当特定范围内没有任何用户时,我遇到了麻烦。例如,如果没有 40-49 岁之间的用户投票给 2,那么结果应该是:

...但我得到的是:

所以,我需要的是所有年龄段都出现在结果中,即使没有匹配项。这是我当前的查询:

SELECT
CASE
    WHEN age BETWEEN 13 AND 19 THEN "age_1"
    WHEN age BETWEEN 20 and 29 THEN "age_2"
    WHEN age BETWEEN 30 and 39 THEN "age_3"
    WHEN age BETWEEN 40 and 49 THEN "age_4"
    WHEN age >= 50 THEN "age_5"
END as age_range,
COUNT(*) AS q
FROM (SELECT user.id_user AS id_user, TIMESTAMPDIFF(YEAR, user.birthday, CURDATE()) AS age FROM user) AS udata
JOIN poll_vote ON poll_vote.id_user = udata.id_user
WHERE poll_vote.id_poll = 2 AND udata.age IS NOT NULL
GROUP BY age_range
ORDER BY age_range

这是带有示例数据的 SQL Fiddle。谢谢!

我会使用左连接与你的总数和合并。

select totals.age_range, coalesce(ages.q,0) total from 
( 
    select 'age_1' age_range 
    union select 'age_2' age_range 
    union select 'age_3' age_range 
    union select 'age_4' age_range 
    union select 'age_5' age_range ) totals 
left join (
  SELECT
CASE
    WHEN age BETWEEN 13 AND 19 THEN "age_1"
    WHEN age BETWEEN 20 and 29 THEN "age_2"
    WHEN age BETWEEN 30 and 39 THEN "age_3"
    WHEN age BETWEEN 40 and 49 THEN "age_4"
    WHEN age >= 50 THEN "age_5"
END as age_range,
COUNT(*) AS q
FROM (SELECT user.id_user AS id_user, TIMESTAMPDIFF(YEAR, user.birthday, CURDATE()) AS age FROM user) AS udata
JOIN poll_vote ON poll_vote.id_user = udata.id_user
WHERE poll_vote.id_poll = 2 AND udata.age IS NOT NULL
GROUP BY age_range
ORDER BY age_range
  ) ages
on totals.age_range = ages.age_range

-- 结果

age_range 总计

age_1 0

age_2 3

age_3 1

age_4 0

age_5 0