LoginSignup
11
8

More than 5 years have passed since last update.

【MySQL】 group_concatでjsonを作る

Last updated at Posted at 2018-02-26

とある事情で複数行のレコードを一つの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

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

11
8
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
8