Mysql 如果在UNION ALL查询中未找到行,则返回默认值 脚本
我在此基础上开发了一个查询,优化的一部分是创建一个MySql视图,用于为用户和销售生成统计数据,问题是当Mysql 如果在UNION ALL查询中未找到行,则返回默认值 脚本,mysql,join,Mysql,Join,我在此基础上开发了一个查询,优化的一部分是创建一个MySql视图,用于为用户和销售生成统计数据,问题是当SELECT行中的一行没有结果时,它会从结果表中被忽略 问题: 如果没有找到任何SELECT的行,如何告诉MySql设置默认值(例如0) 代码 这是创建视图的代码 CREATE OR REPLACE VIEW user_events AS SELECT 'Complete profiles' AS type, created_at FROM users
SELECT
行中的一行没有结果时,它会从结果表中被忽略
问题:
如果没有找到任何SELECT
的行,如何告诉MySql设置默认值(例如0)
代码
这是创建视图的代码
CREATE OR REPLACE VIEW user_events AS
SELECT 'Complete profiles' AS type, created_at
FROM users
WHERE completed_registration = 1
UNION ALL SELECT 'Incomplete profiles', created_at
FROM users
WHERE completed_registration = 0 AND verified_email = 1
UNION ALL SELECT 'Unverified profiles', created_at
FROM users
WHERE verified_email = 0
UNION ALL SELECT 'Onsite Teachers', created_at
FROM onsite_teachers
UNION ALL SELECT 'Onsite Teachers hired', created_at
FROM purchases
INNER JOIN purchased_profiles
ON purchased_profiles.purchase_id = purchases.id
AND purchased_profiles.profile_type = 'onsite_teacher'
WHERE purchases.transaction_status = 'completed'
UNION ALL SELECT 'Translators', created_at
FROM translators
UNION ALL SELECT 'Translators hired', created_at
FROM purchases
INNER JOIN purchased_profiles
ON purchased_profiles.purchase_id = purchases.id
AND purchased_profiles.profile_type = 'translator'
WHERE purchases.transaction_status = 'completed'
UNION ALL SELECT 'Interpreters', created_at
FROM interpreters
UNION ALL SELECT 'Interpreters hired', created_at
FROM purchases
INNER JOIN purchased_profiles
ON purchased_profiles.purchase_id = purchases.id
AND purchased_profiles.profile_type = 'interpreter'
WHERE purchases.transaction_status = 'completed';
这是查询过去6个月(包括本月)总计的代码
SELECT
type,
COUNT(CASE
WHEN created_at >= CAST(CURDATE() - INTERVAL (DAYOFMONTH(CURDATE()) - 1) DAY AS DATETIME)
THEN 1
END) AS 0_month_ago,
COUNT(CASE
WHEN created_at BETWEEN CAST(CURDATE() - INTERVAL (DAYOFMONTH(CURDATE()) - 1) DAY - INTERVAL 1 MONTH AS DATETIME)
AND CAST(LAST_DAY(CURDATE() - INTERVAL 1 MONTH) + INTERVAL 1 DAY AS DATETIME)
THEN 1
END) AS 1_month_ago,
COUNT(CASE
WHEN created_at BETWEEN CAST(CURDATE() - INTERVAL (DAYOFMONTH(CURDATE()) - 1) DAY - INTERVAL 2 MONTH AS DATETIME)
AND CAST(LAST_DAY(CURDATE() - INTERVAL 2 MONTH) + INTERVAL 1 DAY AS DATETIME)
THEN 1
END) AS 2_months_ago,
COUNT(CASE
WHEN created_at BETWEEN CAST(CURDATE() - INTERVAL (DAYOFMONTH(CURDATE()) - 1) DAY - INTERVAL 3 MONTH AS DATETIME)
AND CAST(LAST_DAY(CURDATE() - INTERVAL 3 MONTH) + INTERVAL 1 DAY AS DATETIME)
THEN 1
END) AS 3_months_ago,
COUNT(CASE
WHEN created_at BETWEEN CAST(CURDATE() - INTERVAL (DAYOFMONTH(CURDATE()) - 1) DAY - INTERVAL 4 MONTH AS DATETIME)
AND CAST(LAST_DAY(CURDATE() - INTERVAL 4 MONTH) + INTERVAL 1 DAY AS DATETIME)
THEN 1
END) AS 4_months_ago,
COUNT(CASE
WHEN created_at BETWEEN CAST(CURDATE() - INTERVAL (DAYOFMONTH(CURDATE()) - 1) DAY - INTERVAL 5 MONTH AS DATETIME)
AND CAST(LAST_DAY(CURDATE() - INTERVAL 5 MONTH) + INTERVAL 1 DAY AS DATETIME)
THEN 1
END) AS 5_months_ago
FROM
user_events
GROUP BY
type;
电流输出
如果仔细查看,没有雇用的译员
和译员
行,我希望设置这些行,如果它们返回null
+=========================+===============+===============+===============+==============+===============+===============+
|键入| 0个月前| 1个月前| 2个月前| 3个月前| 4个月前| 5个月前||
+=========================+===============+===============+===============+==============+===============+===============+
|完整剖面图| 7 | 20 | 14 | 25 | 30 | 7|
+-------------------------+---------------+---------------+---------------+--------------+---------------+---------------+
|不完整外形| 12 | 27 | 56 | 45 | 48 | 23|
+-------------------------+---------------+---------------+---------------+--------------+---------------+---------------+
|未经验证的剖面图| 3 | 16 | 23 | 5 | 0 | 9|
+-------------------------+---------------+---------------+---------------+--------------+---------------+---------------+
|现场教师| 11 | 36 | 8 | 15 | 46 | 12|
+-------------------------+---------------+---------------+---------------+--------------+---------------+---------------+
|聘请现场教师| 0 | 0 | 12 | 9 | 3 | 0|
+-------------------------+---------------+---------------+---------------+--------------+---------------+---------------+
|口译员| 4 | 21 | 27 | 46 | 45 | 28|
+-------------------------+---------------+---------------+---------------+--------------+---------------+---------------+
|翻译人员| 7 | 20 | 19 | 27 | 19 | 42|
+-------------------------+---------------+---------------+---------------+--------------+---------------+---------------+
用户事件视图是一种日志,类似于
type | created_at
======================+==============
Interpreters hired | 2014-12-12
Interpreters hired | 2014-12-14
Interpreters hired | 2014-12-16
Interpreters hired | 2015-01-02
但是,如果从未雇用过任何解释器,则不会有类型=“已雇用的解释器”
的行。在这种情况下,计数查询不可能凭空编造一行雇用的口译员
解决方案是确保无论发生什么情况,user\u events
视图中都会出现解释器雇用
行。您可以在
日期不创建任何的情况下创建此类虚构行。这样,总是会有一些东西要按分组,但不一定有任何东西要COUNT()
CREATE OR REPLACE VIEW user_events AS
SELECT 'Complete profiles' AS type, created_at
FROM users
WHERE completed_registration = 1
UNION ALL SELECT 'Incomplete profiles', created_at
FROM users
WHERE completed_registration = 0 AND verified_email = 1
UNION ALL SELECT 'Unverified profiles', created_at
FROM users
WHERE verified_email = 0
UNION ALL SELECT 'Onsite Teachers', created_at
FROM onsite_teachers
UNION ALL SELECT 'Onsite Teachers hired', created_at
FROM purchases
INNER JOIN purchased_profiles
ON purchased_profiles.purchase_id = purchases.id
AND purchased_profiles.profile_type = 'onsite_teacher'
WHERE purchases.transaction_status = 'completed'
UNION ALL SELECT 'Onsite Teachers hired', NULL
UNION ALL SELECT 'Translators', created_at
FROM translators
UNION ALL SELECT 'Translators hired', created_at
FROM purchases
INNER JOIN purchased_profiles
ON purchased_profiles.purchase_id = purchases.id
AND purchased_profiles.profile_type = 'translator'
WHERE purchases.transaction_status = 'completed'
UNION ALL SELECT 'Translators hired', NULL
UNION ALL SELECT 'Interpreters', created_at
FROM interpreters
UNION ALL SELECT 'Interpreters hired', created_at
FROM purchases
INNER JOIN purchased_profiles
ON purchased_profiles.purchase_id = purchases.id
AND purchased_profiles.profile_type = 'interpreter'
WHERE purchases.transaction_status = 'completed'
UNION ALL SELECT 'Interpreters hired', NULL;