2016-10-09 15 views
1

私はMariaDBの標準テーブルにデータを格納していますが、関連するテーブルのレコードをJSON文字列として返したいと思います。私はするつもり何複数のCOLUMN_JSON結果をJSON配列として返します

は、私がexerciseIdに渡すことができます機能を持っており、機能はストアドプロシージャによって返される各exerciseレコードは、子テーブルからのネストされたデータを含めることができることを意味し、すべての関連exerciseMuscleレコードのJSON文字列を返します。

COLUMN_JSONCOLUMN_CREATEを使用してJSONレコードを作成することはできましたが、これを必要とするJSON値の配列ではなく、個々のレコードのセットとして返すことしかできません。私が使用しているSQLは次のとおりです。

select 
    e.id, 
    CONVERT(COLUMN_JSON(COLUMN_CREATE(
     'role', em.muscleRoleName, 
     'muscle', em.muscleName 
    )) USING utf8) as musclesJson 
from 
    exercise e 
    inner join exerciseMuscle em 
      on e.id = em.exerciseId 
where 
    e.id = 96; 

これが返されます。

| id | musclesJson 
| 96 | {"role":"main","muscle":"biceps"} 
| 96 | {"role":"secondary","muscle":"shoulders"} 

を私がしたいことはあるとき:

| id | musclesJson 
| 96 | [{"role":"main","muscle":"biceps"},{"role":"secondary","muscle":"shoulders"}] 

はなくても、1行に複数の結果を返すために、それは可能です結果を反復して手動で構築するには? SQLにgroup byを追加すると、JSONには最初のレコードのみが含まれます。

+0

あなたが使用しているMySQLのバージョン? – Dez

+0

MariaDB 10.0.24、変更されたタグ – CrazyHorse

答えて

2

私が必要としていたのはGROUP_CONCATで、デリミタとしてカンマを指定しています。

select 
    e.id, 
    CONVERT(
     GROUP_CONCAT(
      COLUMN_JSON(
       COLUMN_CREATE(
        'role', em.muscleRoleName, 
        'muscle', em.muscleName 
       ) 
      ) 
      SEPARATOR ',' 
     ) USING utf8) as muscles 
from 
    exercise e 
    inner join exerciseMuscle em 
      on e.id = em.exerciseId 
where 
    e.id = 96; 

戻り値:そうに私のSQLを変更

| id | musclesJson 
| 96 | {"role":"main","muscle":"biceps"},{"role":"secondary","muscle":"shoulders"} 
関連する問題