
[英]SQL_CALC_FOUND_ROWS and SELECT FOUND_ROWS() on UNION query (not UNION ALL) with LIMIT
[英]Return a default value if no rows are found in UNION ALL query
我有一個從這個問題開發的查詢,優化的一部分是創建一個MySql視圖,用於為用戶和銷售生成統計信息,問題是當其中一個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;
如果你仔細觀察,沒有Interpreters hired
和Translators hired
行,我想要設置這些行,如果它們返回null
則歸零
+=========================+===============+===============+===============+==============+===============+===============+
| type | 0_month_ago | 1_month_ago | 2_month_ago | 3_month_ago | 4_month_ago | 5_month_ago |
+=========================+===============+===============+===============+==============+===============+===============+
| Complete profiles | 7 | 20 | 14 | 25 | 30 | 7 |
+-------------------------+---------------+---------------+---------------+--------------+---------------+---------------+
| Incomplete profiles | 12 | 27 | 56 | 45 | 48 | 23 |
+-------------------------+---------------+---------------+---------------+--------------+---------------+---------------+
| Unverified profiles | 3 | 16 | 23 | 5 | 0 | 9 |
+-------------------------+---------------+---------------+---------------+--------------+---------------+---------------+
| Onsite Teachers | 11 | 36 | 8 | 15 | 46 | 12 |
+-------------------------+---------------+---------------+---------------+--------------+---------------+---------------+
| Onsite Teachers hired | 0 | 0 | 12 | 9 | 3 | 0 |
+-------------------------+---------------+---------------+---------------+--------------+---------------+---------------+
| Interpreters | 4 | 21 | 27 | 46 | 45 | 28 |
+-------------------------+---------------+---------------+---------------+--------------+---------------+---------------+
| Translators | 7 | 20 | 19 | 27 | 19 | 42 |
+-------------------------+---------------+---------------+---------------+--------------+---------------+---------------+
user_events
視圖是一種日志,看起來像
type | created_at
======================+==============
Interpreters hired | 2014-12-12
Interpreters hired | 2014-12-14
Interpreters hired | 2014-12-16
Interpreters hired | 2015-01-02
但是,如果沒有雇用過口譯員,那么就不會有type = 'Interpreters hired'
。 在這種情況下,計數查詢無法憑空創建一個Interpreters hired
行。
解決方案是確保在user_events
視圖中出現Interpreters hired
行,無論如何。 您可以創建沒有created_at
日期的虛構行。 這樣, GROUP BY
總會有一些東西,但不一定是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;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.