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

重複行をまとめた上でのカウントはGROUP BYではなくDISTINCTを使う

MySQL

"重複したカラムをまとめた上でのカウント" がしたい時に、いつもどおりGROUP BYを使ったらうまくカウントできませんでした。
そりゃそうだろ、という話ではありますが。
以下、MySQLを使っています。


例えば、ユーザが何かしらの投稿をするサイトがあって、以下の様なデータベースが存在する場合を考えます。 f:id:norikone:20160409030058p:plain f:id:norikone:20160409030523p:plain f:id:norikone:20160409030520p:plain


ここで、1回でも投稿したことがあるユーザの数を求めたいとします。
この場合だと、投稿したことがあるのは ichirou と jirou の2人です。

直観的に posts テーブルを GROUP BY user_id でまとめてカウントしても意図した結果は返ってきません。
f:id:norikone:20160409034804p:plain ここに表示されている行数が返ってきて欲しいのです。


このような場合は、GROUP BY ではなく DISTINCT でまとめると上手くいきます。
f:id:norikone:20160409035448p:plain


DISTINCT でまとめれば上手くいきますが、場合によってはクエリ最適化が働いて、以下のように GROUP BY したものをカウントしたほうが早くなることがあるようです。 f:id:norikone:20160409040820p:plain



おわり。