如何显示所有 Case When Then 记录,即使 MySQL 中为 NULL
How to show all Case When Then records even if NULL in MySQL
我必须显示有多少用户投票给 2,但按年龄范围分开。
我当前的查询工作正常;但是当特定范围内没有任何用户时,我遇到了麻烦。例如,如果没有 40-49 岁之间的用户投票给 2,那么结果应该是:
- age_1 [13-19] = 0
- age_2 [20-29] = 3
- age_3 [30-39] = 1
- age_4 [40-49] = 0
- age_5 [50+] = 0
...但我得到的是:
- age_2 [20-29] = 3
- age_3 [30-39] = 1
所以,我需要的是所有年龄段都出现在结果中,即使没有匹配项。这是我当前的查询:
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
我必须显示有多少用户投票给 2,但按年龄范围分开。
我当前的查询工作正常;但是当特定范围内没有任何用户时,我遇到了麻烦。例如,如果没有 40-49 岁之间的用户投票给 2,那么结果应该是:
- age_1 [13-19] = 0
- age_2 [20-29] = 3
- age_3 [30-39] = 1
- age_4 [40-49] = 0
- age_5 [50+] = 0
...但我得到的是:
- age_2 [20-29] = 3
- age_3 [30-39] = 1
所以,我需要的是所有年龄段都出现在结果中,即使没有匹配项。这是我当前的查询:
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