茨城県取手市で働くWebクリエイター 馬場誠のサイト(2018/東京都世田谷区から移住しました)

馬場誠.comブログ

MySQLで曜日ごとに集計する


PHP&MySQLでWebアプリ作成中に、曜日ごとの集計をすることに。
このあたりはよく忘れてその都度調べることになるので、自分用にメモ。

SELECT
(CASE
WHEN DATE_FORMAT(created, '%W') = 'Monday'    THEN '月曜日'
WHEN DATE_FORMAT(created, '%W') = 'Tuesday'   THEN '火曜日'
WHEN DATE_FORMAT(created, '%W') = 'Wednesday' THEN '水曜日'
WHEN DATE_FORMAT(created, '%W') = 'Thursday'  THEN '木曜日'
WHEN DATE_FORMAT(created, '%W') = 'Friday'    THEN '金曜日'
WHEN DATE_FORMAT(created, '%W') = 'Saturday'  THEN '土曜日'
WHEN DATE_FORMAT(created, '%W') = 'Sunday'    THEN '日曜日'
END) AS week,
COUNT(*) AS num,
COUNT(DISTINCT(cookie)) as `unique`
FROM logs
WHERE (user_id = :USERID AND status = 1)
GROUP BY week

これで、PHPからfetchしていけば、こんな感じで利用できます。

array(
	0 => 
	array(
		[week] => 月曜日,
		[num]  => 11770,
		[unique] => 3770,
	),
	1 => 
	array(
		[week] => 火曜日,
		[num] => 7770,
		[unique] => 3270,
	),
	~略
);

おまけ:PostgreSQL用!?

検索している最中にみつけたもので、PostgreSQL専用っぽいですがCASE部分はこんな書き方ができる模様。
こちらもあくまでも自分用のメモとして残しておきます(こちらは試してないので動くか分かりませんが)。

(CASE
WHEN DATE_PART('dow',created) = 0 THEN '日曜日'
WHEN DATE_PART('dow',created) = 1 THEN '月曜日'
WHEN DATE_PART('dow',created) = 2 THEN '火曜日'
WHEN DATE_PART('dow',created) = 3 THEN '水曜日'
WHEN DATE_PART('dow',created) = 4 THEN '木曜日'
WHEN DATE_PART('dow',created) = 5 THEN '金曜日'
WHEN DATE_PART('dow',created) = 6 THEN '土曜日' END ) AS week,

コメントをどうぞ