読者です 読者をやめる 読者になる 読者になる

SQLでカラムの値が重複しないレコードをカウントする

Server

個人的メモに近い何か。

MySQLって意外とビルトインの関数が豊富だったりするので、思ったよりいろいろなことが各種スクリプト言語の助けを借りずにできてしまうっぽい。
というわけで、カラムの値が重複しないレコードのカウント。

(例)ログイン履歴のテーブルから総ログインUU(ユニークユーザ)数をカウントする

iduser_idcreated_at
134892013-02-12 02:33:21
243122013-02-16 18:23:23
362922013-02-18 23:09:01
434892013-02-20 18:43:08
545922013-02-24 13:38:29
634892013-02-26 23:19:23
723862013-02-27 09:17:23
862922013-02-28 04:34:19
965212013-02-28 13:12:34
1034892013-03-01 04:23:10

こんなログイン履歴のテーブル(login_logs)があるとする。
この中から、今までログインしたことのあるユーザの人数を数えたいとする。
ド真面目にやろうとすると、レコードのuser_idを一つずつ見ていって、一度でもログイン履歴に残ってるユーザのuser_idは配列にフラグを立てていって、それをカウントしていって…とか明らかに馬鹿らしい。
もうちょっと考えると、userのテーブルに一度でもログインしたかどうかのフラグを持たせるのもいいのかもしれない。
でも、実はこれをカウントする方法がある。
それがselect distinct。

SELECT DISTINCT [column_name, ...] FROM [table_name];

これでテーブルtable_nameの中からcolumn_nameを重複しないように抽出する。

SELECT DISTINCT user_id FROM login_logs;

とすれば

3489, 4312, 6292, 3489, 4592, 3489, 2386, 6292, 6521, 3489, ...

といったように、user_idが重複したレコードは抽出されない。
これの数を数えてやればいいのでCOUNT関数との合わせ技で

SELECT COUNT(DISTINCT user_id) FROM login_logs;

でカウントできる。やったね!