mysql - 选择出现次数为零的每月计数

标签 mysql select count union

我的问题是根据 creatin 的年份和月份从数据库中选择记录计数。我有这个 MySQL 查询:

SELECT year, m, month, COUNT(bans.ban_id) AS total
FROM (
    SELECT year, m, month
    FROM
    (SELECT YEAR(CURDATE()) year UNION ALL SELECT YEAR(CURDATE())-1) years,
    (
        SELECT 1 m, 'Jan' month
        UNION ALL SELECT 2 m, 'Feb' month
        UNION ALL SELECT 3 m, 'Mar' month
        UNION ALL SELECT 4 m, 'Apr' month
        UNION ALL SELECT 5 m, 'May' month
        UNION ALL SELECT 6 m, 'Jun' month
        UNION ALL SELECT 7 m, 'Jul' month
        UNION ALL SELECT 8 m, 'Aug' month
        UNION ALL SELECT 9 m, 'Sep' month
        UNION ALL SELECT 10 m, 'Oct' month
        UNION ALL SELECT 11 m, 'Nov' month
        UNION ALL SELECT 12 m, 'Dec' month
    ) months
) ym
LEFT JOIN bans
    ON ym.year = YEAR(bans.ban_created_at)
    AND ym.m = MONTH(bans.ban_created_at)
WHERE
    (year=YEAR(CURDATE()) AND m<=MONTH(CURDATE()))
    OR
    (year<YEAR(CURDATE()) AND m>MONTH(CURDATE()))
    AND
    (ban_banlist_id = 13)
GROUP BY year, m

它几乎可以正常工作,但是 - 问题是查询只返回具有有效记录数的值 - 例如当月没有记录时,不返回

最佳答案

原因是右表 (bans) 上的条件在 WHERE 子句上,因此它应用于结果,结果只会选择出现的月份。放在LEFT JOIN子句的ON子句上,像这样:

SELECT year, m, month, COUNT(bans.ban_id) AS total
FROM (
    SELECT year, m, month
    FROM
    (SELECT YEAR(CURDATE()) year UNION ALL SELECT YEAR(CURDATE())-1) years,
    (
        SELECT 1 m, 'Jan' month
        UNION ALL SELECT 2 m, 'Feb' month
        UNION ALL SELECT 3 m, 'Mar' month
        UNION ALL SELECT 4 m, 'Apr' month
        UNION ALL SELECT 5 m, 'May' month
        UNION ALL SELECT 6 m, 'Jun' month
        UNION ALL SELECT 7 m, 'Jul' month
        UNION ALL SELECT 8 m, 'Aug' month
        UNION ALL SELECT 9 m, 'Sep' month
        UNION ALL SELECT 10 m, 'Oct' month
        UNION ALL SELECT 11 m, 'Nov' month
        UNION ALL SELECT 12 m, 'Dec' month
    ) months
) ym
LEFT JOIN bans
    ON ym.year = YEAR(bans.ban_created_at)
    AND ym.m = MONTH(bans.ban_created_at)
    AND ban_banlist_id = 13
WHERE
    (year=YEAR(CURDATE()) AND m<=MONTH(CURDATE()))
    OR
    (year<YEAR(CURDATE()) AND m>MONTH(CURDATE()))
GROUP BY year, m

关于mysql - 选择出现次数为零的每月计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35126143/

相关文章:

php - 有没有更好的方法来处理 Doctrine 代理对象

mysql - 我们可以在Mysql的存储过程中写一个存储函数吗

MySQL按值选择计数

php - MySQL 求和与连接

Java连接池(JNDI)半天后不起作用

mysql - 获取两列之间大于三天的时间差 - MySQL Workbench

php - MySQL - 在 $var = array 的位置获取数据?

sql - 计算每个唯一值的出现次数

可变时间范围内的Mysql最大行数

mysql - mysql查询游戏hi​​scores真的很慢