2016-05-26 19 views
2

MySQLバージョン5.7.12(マニュアルのセクション13.16)でネイティブJSON関数(PHPなどはありません)のみを使用しています。サブオブジェクトを含むリレーショナルテーブルからJSONドキュメントを生成するクエリを作成しようとしています。次の例を考える:mysqlネイティブjson関数を使用して入れ子になったjsonオブジェクトを生成するにはどうすればよいですか?

CREATE TABLE `parent_table` (
    `id` int(11) NOT NULL, 
    `desc` varchar(20) NOT NULL, 
    PRIMARY KEY (`id`) 
); 
CREATE TABLE `child_table` (
    `id` int(11) NOT NULL, 
    `parent_id` int(11) NOT NULL, 
    `desc` varchar(20) NOT NULL, 
    PRIMARY KEY (`id`,`parent_id`) 
); 
insert `parent_table` values (1,'parent row 1'); 
insert `child_table` values (1,1,'child row 1'); 
insert `child_table` values (2,1,'child row 2'); 

私はこのようになりますJSONドキュメントを生成しようとしています:

[{ 
    "id" : 1, 
    "desc" : "parent row 1", 
    "child_objects" : [{ 
      "id" : 1, 
      "parent_id" : 1, 
      "desc" : "child row 1" 
     }, { 
      "id" : 2, 
      "parent_id" : 1, 
      "desc" : "child row 2" 
     } 
    ] 
}] 

私は、MySQLに新しいですから、ネストされたJSONオブジェクトを生成するためのSQLパターンがあると疑われます1対多の関係だが、私はそれを見つけるのが難しい。

次作品(私はともっとよく知っている)は、Microsoft SQLでは

:私は次のようにMySQLの等価を書き込もうとし

select 
[p].[id] 
,[p].[desc] 
,(select * from [dbo].[child_table] where [parent_id] = [p].[id] for json auto) AS [child_objects] 
from [dbo].[parent_table] [p] 
for json path 

select json_object(
'id',p.id 
,'desc',p.`desc` 
,'child_objects',(select json_object('id',id,'parent_id',parent_id,'desc',`desc`) 
        from child_table where parent_id = p.id) 
) 
from parent_table p; 

select json_object(
    'id',p.id 
,'desc',p.`desc` 
,'child_objects',json_array((select json_object('id',id,'parent_id',parent_id,'desc',`desc`) 
           from child_table where parent_id = p.id)) 
) 
from parent_table p 

どちらの試みが失敗すると次のエラーが発生しました:

Error Code: 1242. Subquery returns more than 1 row 

答えて

5

これらのエラーが発生する理由は、親jsonオブジェクトが入力の1つとして結果セットを期待していない場合は、{name、string}などの単純なオブジェクトのペアを持つ必要がありますbug report - may be available in future functionality ...これは、複数行の結果を次のように区切られた結果の連結に変換する必要があることを意味します。コンマで区切り、json配列に変換します。

ほとんどの場合、2番目の例があります。

あなたはGROUP_CONCAT機能

select json_object(
    'id',p.id 
,'desc',p.`desc` 
,'child_objects',json_array(
        (select GROUP_CONCAT(
           json_object('id',id,'parent_id',parent_id,'desc',`desc`) 
          ) 
         from child_table 
         where parent_id = p.id)) 
        ) 
from parent_table p; 

これはほとんど作品とした後、それはそこにエスケープ文字を残し文字列としてサブクエリを処理するまで終了しているものを達成することができます。

select json_object(
    'id',p.id 
,'desc',p.`desc` 
,'child_objects',(select CAST(CONCAT('[', 
       GROUP_CONCAT(
        JSON_OBJECT(
        'id',id,'parent_id',parent_id,'desc',`desc`)), 
       ']') 
     AS JSON) from child_table where parent_id = p.id) 

) from parent_table p; 

これはあなたが必要と正確な結果が得られます:次のように

適切な形式でこの作業を取得するために
'{\"id\": 1, 
\"desc\": \"parent row 1\", 
\"child_objects\": 
    [\" 
    {\\\"id\\\": 1, 
    \\\"desc\\\": \\\"child row 1\\\", 
    \\\"parent_id\\\": 1 
    }, 
    {\\\"id\\\": 2, 
    \\\"desc\\\": \\\"child row 2\\\", 
    \\\"parent_id\\\": 1}\" 
    ] 
}' 

、あなたはJSON出力を作成する方法を変更する必要があります

'{\"id\": 1, 
\"desc\": \"parent row 1\", 
\"child_objects\": 
    [{\"id\": 1, 
    \"desc\": \"child row 1\", 
    \"parent_id\": 1 
    }, 
    {\"id\": 2, 
    \"desc\": \"child row 2\", 
    \"parent_id\": 1 
    }] 
}' 
+0

こんにちは、私はjson_objectこの関数を使用することができません。 #1305 - 機能json_objectが存在しません。何をすべきか??? – Sandeep

+0

使用しているMysqlのバージョンを確認してください。古いバージョンはjson_objectをサポートしていません –

+0

現在のバージョンは5.6です – Sandeep

関連する問題