我需要使用一个 mysql 语句每月分发我的数据。以下声明的预期结果:包含 12 行的表格。如果一个月内没有可用数据,则本月应返回 0。但是,在当前 SQL 语句的结果中,如果缺少数据,则会缺少一行或多行。我错过了什么?
SELECT m.Month as m1, MONTH(FROM_UNIXTIME(crdate)) as m2,
SUM(CASE WHEN keylock = 1 THEN 1 ELSE 0 END) AS c1, SUM(CASE WHEN keylock = 2 THEN 1 ELSE 0 END) AS c2
FROM tx_bhm_domain_model_access a
RIGHT OUTER JOIN (
SELECT 1 AS Month
UNION SELECT 2 AS Month
UNION SELECT 3 AS Month
UNION SELECT 4 AS Month
UNION SELECT 5 AS Month
UNION SELECT 6 AS Month
UNION SELECT 7 AS Month
UNION SELECT 8 AS Month
UNION SELECT 9 AS Month
UNION SELECT 10 AS Month
UNION SELECT 11 AS Month
UNION SELECT 12 AS Month ) m
ON MONTH(FROM_UNIXTIME(a.crdate)) = m.Month
WHERE YEAR(FROM_UNIXTIME(a.crdate))=2018
GROUP BY m.Month
ORDER BY m.Month
YEAR()
比较需要在ON
子句中进行。 我更喜欢LEFT JOIN
:
SELECT m.Month as m1, MONTH(FROM_UNIXTIME(crdate)) as m2,
SUM(CASE WHEN keylock = 1 THEN 1 ELSE 0 END) AS c1,
SUM(CASE WHEN keylock = 2 THEN 1 ELSE 0 END) AS c2
FROM (SELECT 1 AS Month UNION ALL
SELECT 2 AS Month UNION ALL
SELECT 3 AS Month UNION ALL
SELECT 4 AS Month UNION ALL
SELECT 5 AS Month UNION ALL
SELECT 6 AS Month UNION ALL
SELECT 7 AS Month UNION ALL
SELECT 8 AS Month UNION ALL
SELECT 9 AS Month UNION ALL
SELECT 10 AS Month UNION ALL
SELECT 11 AS Month UNION ALL
SELECT 12 AS Month
) m LEFT JOIN
tx_bhm_domain_model_access a
ON MONTH(FROM_UNIXTIME(a.crdate)) = m.Month AND
YEAR(FROM_UNIXTIME(a.crdate)) = 2018
GROUP BY m.Month
ORDER BY m.Month;
我还将UNION
s更改为UNION ALL
s。 无需产生删除重复项的开销。