web-dev-qa-db-ja.com

group-concat mysqlでjson形式を作成するにはどうすればよいですか?

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"}
_

ありがとう

42
Yosef

このクエリを試してください-

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"} |
+---------------+-------------------------------------------------------------+
66
Devart

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解析可能です。お役に立てれば。

59
myusuf

上記の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を追加しました。

16
alexkorn

これが正しい目を見つけることを願っています。

次を使用できます。

配列の場合(- documentation ):

JSON_ARRAYAGG(col_or_expr) as ...

オブジェクトの場合ドキュメント ):

JSON_OBJECTAGG(key, value) as ...
8
Matthew Semik

@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 "}]
1

このように使用する

SELECT email,concat('{name:"',ur_name_column,'",phone:"',ur_phone_column,'"}') as list FROM table1 GROUP BY email;

乾杯

0
Sundar G