📊
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