📊

MySQLのgroup byでgroup_concatを使って複数レコードの文字列を結合させたものをhavingの条件に含める

2022/07/01に公開

dbから特定のデータを取ってきたい時にかなり詰まったのでメモ。

取ってきたい条件

以下のようなdbがあるとする。

messagesテーブル

id user_id title body
1 1 テスト これはテスト
2 1 テスト 特になし
3 2 テスト 特になし
4 2 こんにちは こんにちは!
5 3 こんばんは こんばんは!
実際にはもっとレコードある想定

上記のようなテーブルから、user_idでグルーピングして、グループのレコードが10個以上かつそのグループの中に1レコードでもtitleに「こんにちは」という文字列を持つレコードがあれば返すというような条件のSQLを作りたい。

SQL

以下のようなSQLを作れば、実現できる。

select m.user_id, group_concat(m.title) as titles
from messages as m
group by m.user_id
having count(*) >= 10
and titles like '%こんにちは%'
user_id titles
2 テスト,こんにちは

user_idでグルーピングして、グルーピングしたレコードが10個以上かつそのグルーピングしたレコードのtitleを結合してlike検索し、「こんにちは」を含む場合だけ返すということができる。

参考

MySQLでGROUP BY時にすべての値を連結して取得 (GROUP_CONCAT)

Discussion