📊
MySQLのgroup byでgroup_concatを使って複数レコードの文字列を結合させたものをhavingの条件に含める
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検索し、「こんにちは」を含む場合だけ返すということができる。
Discussion