とある事情で複数行のレコードを一つのjsonに押し込みたかったのでgroup_concat
でjsonを作成しました。
やりたいこと
Authors | |
---|---|
id | name |
1 | author1 |
Books | ||
---|---|---|
id | name | author_id |
1 | book1 | 1 |
2 | book2 | 1 |
以上のAuthorsテーブルとBooksテーブルから |
id | name | books |
---|---|---|
1 | author1 | [{"id":1,"name":"book1"},{"id":2,"name":"book2"}] |
のような配列型のjsonを含むデータを作ります。
SQL
.sql
select
Authors.id,
Authors.name,
concat('[', trim(trailing ',' from group_concat('{"id":', Books.id, ',"name":"', Books.name, '"},')), ']')
from Authors inner join Books on Books.author_id = Authors.id
group by Authors.id;
解説
group_concat
は連結した文字列を返す集約関数です。
これを使って、複数行のレコードを一つの文字列にまとめます。
イメージとしては、1レコードに対するconcat
を集約されたレコードに対して繰り返して全部繋げる感じです。
これだけだと最後のカンマが余るのでtrim
関数にtrailing
オプションをつけて一番右のカンマを削除します。
最後にconcatで[]
で囲って完了です。
参考リンク
trim
関数やgroup_concat
関数の詳細については以下のリンクを参考にしてください。
trim
https://dev.mysql.com/doc/refman/5.6/ja/string-functions.html#function_trim
group_concat
https://dev.mysql.com/doc/refman/5.6/ja/group-by-functions.html#function_group-concat