sql >> データベース >  >> RDS >> Mysql

データが存在しない場合でも月ごとのレコードを選択するMysql

    他の方法に対してテストしたことがないので、効率についてはあまり言いませんが、一時的なテーブルがなければ、これは公正な方法のようです。

       SELECT COUNT(u.userID) AS total, m.month
         FROM (
               SELECT 'Jan' AS MONTH
               UNION SELECT 'Feb' AS MONTH
               UNION SELECT 'Mar' AS MONTH
               UNION SELECT 'Apr' AS MONTH
               UNION SELECT 'May' AS MONTH
               UNION SELECT 'Jun' AS MONTH
               UNION SELECT 'Jul' AS MONTH
               UNION SELECT 'Aug' AS MONTH
               UNION SELECT 'Sep' AS MONTH
               UNION SELECT 'Oct' AS MONTH
               UNION SELECT 'Nov' AS MONTH
               UNION SELECT 'Dec' AS MONTH
              ) AS m
    LEFT JOIN users u 
    ON MONTH(STR_TO_DATE(CONCAT(m.month, ' 2013'),'%M %Y')) = MONTH(u.userRegistredDate)
       AND YEAR(u.userRegistredDate) = '2013'
    GROUP BY m.month
    ORDER BY 1+1;
    

    日付形式に基づいて結合を作成すると、クエリの作業と負荷を減らすこともできます。

       SELECT COUNT(u.userID) AS total, DATE_FORMAT(merge_date,'%b') AS month, YEAR(m.merge_date) AS year
         FROM (
               SELECT '2013-01-01' AS merge_date
               UNION SELECT '2013-02-01' AS merge_date
               UNION SELECT '2013-03-01' AS merge_date
               UNION SELECT '2013-04-01' AS merge_date
               UNION SELECT '2013-05-01' AS merge_date
               UNION SELECT '2013-06-01' AS merge_date
               UNION SELECT '2013-07-01' AS merge_date
               UNION SELECT '2013-08-01' AS merge_date
               UNION SELECT '2013-09-01' AS merge_date
               UNION SELECT '2013-10-01' AS merge_date
               UNION SELECT '2013-11-01' AS merge_date
               UNION SELECT '2013-12-01' AS merge_date
              ) AS m
    LEFT JOIN users u 
           ON MONTH(m.merge_date) = MONTH(u.userRegistredDate)
              AND YEAR(m.merge_date) = YEAR(u.userRegistredDate)
    GROUP BY m.merge_date
    ORDER BY 1+1;
    

    両方のクエリのライブデモ。



    1. 各グループの上位3つの値を選択します

    2. MySQLでフィールドがnullの場合は0を返します

    3. IntegrityErrorの重複キー値が一意の制約に違反しています-django/postgres

    4. SQLでテキストを小文字に変更する方法