データが存在しない場合でも MySQL で月単位のレコードを選択する方法
ユーザー テーブルから月単位のレコードを取得するにはでは、次のようなクエリを使用できます:
SELECT COUNT(`userID`) AS total, DATE_FORMAT(`userRegistredDate`, '%b') AS MONTH, YEAR(`userRegistredDate`) AS year FROM `users` GROUP BY DATE_FORMAT(FROM_UNIXTIME(`userRegistredDate`, '%b'))
このクエリにより、合計数が得られます。ユーザーの数と登録月と年。ただし、既存のデータがある月のみが表示されます。
データのない月を含めるには、次のいずれかの方法を使用できます。
方法 1 : Union of Months
このメソッドでは、必要なすべての月の和集合を作成します。 year:
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;
メソッド 2: 日付の結合
このメソッドは、目的の年のすべての月の日付の結合を作成します:
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;
両方のユニオン メソッドですべての月のプレースホルダーが作成されるため、データが存在しない場合でもレコードを表示できます。 2 つの方法のどちらを選択するかは、特定の要件によって異なります。
以上が特定の月にデータが存在しない場合でも、MySQL で月ごとのレコードを取得するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。