Group-concat mysqlでjson形式を作成するにはどうすればよいですか?
(MySQLを使用)
例1:
表1:
_email | name | phone
-------------------------------------
[email protected] | Ben | 6555333
[email protected] | Tom | 2322452
[email protected] | Dan | 8768768
[email protected] | Joi | 3434356
_
私に形式を与えない構文コードのように:
select email, group-concat(name,phone) as list from table1 group by email
必要な出力:
_email | list
------------------------------------------------
[email protected] | {name:"Ben",phone:"6555333"},{name:"Joi",phone:"3434356"}
[email protected] | {name:"Tom",phone:"2322452"},{name:"Dan",phone:"8768768"}
_
ありがとう
このクエリを試してください-
SELECT
email,
GROUP_CONCAT(CONCAT('{name:"', name, '", phone:"',phone,'"}')) list
FROM
table1
GROUP BY
email;
JSON形式の結果-
+---------------+-------------------------------------------------------------+
| email | list |
+---------------+-------------------------------------------------------------+
| [email protected] | {name:"Ben", phone:"6555333"},{name:"Joi", phone:"3434356"} |
| [email protected] | {name:"Tom", phone:"2322452"},{name:"Dan", phone:"8768768"} |
+---------------+-------------------------------------------------------------+
MySQLの新しいバージョンでは、次のようにJSON_OBJECT関数を使用して目的の結果を得ることができます。
GROUP_CONCAT(
JSON_OBJECT(
'name', name,
'phone', phone
)
) AS list
SQL応答を配列として解析する準備をするには:
CONCAT(
'[',
GROUP_CONCAT(
JSON_OBJECT(
'name', name,
'phone', phone
)
),
']'
) AS list
これにより、次のような文字列が得られます。[{name: 'ABC', phone: '111'}, {name: 'DEF', phone: '222'}]
これはJSON解析可能です。お役に立てれば。
上記のDevartの答えは素晴らしいですが、K2xLの質問は有効です。私が見つけた答えは、HEX()を使用して名前列を16進数でエンコードすることでした。これにより、有効なJSONが作成されます。次に、アプリケーションで、16進数を変換して文字列に戻します。
(セルフプロモーションはごめんなさい、しかし)私はこれについてもう少し詳細に小さなブログ投稿を書きました: http://www.alexkorn.com/blog/2015/05/hand-rolling-valid- json-in-mysql-using-group_concat /
[Oriolの編集]次に例を示します。
SELECT email,
CONCAT(
'[',
COALESCE(
GROUP_CONCAT(
CONCAT(
'{',
'\"name\": \"', HEX(name), '\", ',
'\"phone\": \"', HEX(phone), '\"',
'}')
ORDER BY name ASC
SEPARATOR ','),
''),
']') AS bData
FROM table
GROUP BY email
また、そのメール用のアイテムがない場合に備えてCOALESCEを追加しました。
これが正しい目を見つけることを願っています。
次を使用できます。
配列の場合(- documentation ):
JSON_ARRAYAGG(col_or_expr) as ...
オブジェクトの場合( ドキュメント ):
JSON_OBJECTAGG(key, value) as ...
@Devartの答えを無視して...フィールドに改行または二重引用符が含まれている場合、結果は有効なJSONではありません。
そのため、「電話」フィールドに二重引用符と改行が含まれていることがわかっている場合、SQLは次のようになります。
SELECT email、 CONCAT( '['、 GROUP_CONCAT(CONCAT( '{name: "'、 名前、 '"、phone:"'、 REPLACE(REPLACE(phone、 '"'、 '\\\\"')、 '\ n'、 '\\\\ n ')、 ' "} ' ))、 ' )AS list FROM table1 GROUP BY email;
Ben電話の途中に引用符があり、Joi'sに改行がある場合、SQLは次のような(有効なJSON)結果を返します。
[{name: "Ben"、phone: "655 \" 5333 "}、{name:" Joi "、phone:" 343\n4356 "}]
このように使用する
SELECT email,concat('{name:"',ur_name_column,'",phone:"',ur_phone_column,'"}') as list FROM table1 GROUP BY email;
乾杯