首页 > 解决方案 > IFNULL 什么都不返回,而不是 0,有什么方法可以使它工作?

问题描述

我正在做一个查询来计算必须等待超过 30 分钟的用户的百分比。外部查询选择过去 30 天的用户类型(有 6 种类型)和用户总数(按 user_type 分组)。

子查询旨在返回必须等待超过 30 分钟的所有用户的计数。

我遇到的问题是,根据诊所的不同,有时没有用户必须等待超过 30 分钟,所以我会丢失行,mysql 会无休止地尝试执行查询

我尝试使用 COALESCE 和 IFNULL,但它们没有像我想要的那样返回 0,因为我还需要使用 GROUP BY 来保持行分隔

是否有另一种方法可以让没有结果的行返回 0 而不是完全排除在外?

这是我的查询:

SELECT
user_type,
count(user_type) total_users,
        (SELECT
        count(user_type)
        FROM
        my_clinic
        WHERE Appt_date BETWEEN NOW() - INTERVAL 30 DAY AND NOW()
        AND clinic = 'Baseball'
        AND wait_time > 30
        GROUP BY user_type) as total_over_thirty
FROM
my_clinic
WHERE Appt_date BETWEEN NOW() - INTERVAL 30 DAY AND NOW()
AND clinic = 'Baseball'
GROUP BY user_type

预期输出应如下所示

user_type total_users total_over_thirty
type1        300           25
type2        400           45
type3        600           15
type4        250           45
type5        300           15
type6        300           28

但是,当有 0 个用户等待特定 user_type 的时间不到 30 分钟时,您会得到行不匹配,并且会在查询中引发问题

标签: mysqlsubquery

解决方案


您可以在没有子查询的情况下进行查询:

SELECT
  user_type,
  count(user_type) total_users,
  sum(if (wait_time>30, 1, 0)) as total_over_thirty
FROM my_clinic
WHERE Appt_date BETWEEN NOW() - INTERVAL 30 DAY AND NOW() AND clinic = 'Baseball'
GROUP BY user_type

推荐阅读