Yos*_*sef 42 mysql sql group-concat
如何使用group-concat mysql创建json格式?
(我使用MySQL)
例1:
表格1:
email | name | phone
-------------------------------------
my1@gmail.com | Ben | 6555333
my2@gmail.com | Tom | 2322452
my2@gmail.com | Dan | 8768768
my1@gmail.com | Joi | 3434356
Run Code Online (Sandbox Code Playgroud)
像语法代码,不给我格式:
select email, group-concat(name,phone) as list from table1 group by email
我需要的输出:
email | list
------------------------------------------------
my1@gmail.com | {name:"Ben",phone:"6555333"},{name:"Joi",phone:"3434356"}
my2@gmail.com | {name:"Tom",phone:"2322452"},{name:"Dan",phone:"8768768"}
Run Code Online (Sandbox Code Playgroud)
谢谢
Dev*_*art 66
试试这个查询 -
SELECT
email,
GROUP_CONCAT(CONCAT('{name:"', name, '", phone:"',phone,'"}')) list
FROM
table1
GROUP BY
email;
Run Code Online (Sandbox Code Playgroud)
JSON格式结果 -
+---------------+-------------------------------------------------------------+
| email | list |
+---------------+-------------------------------------------------------------+
| my1@gmail.com | {name:"Ben", phone:"6555333"},{name:"Joi", phone:"3434356"} |
| my2@gmail.com | {name:"Tom", phone:"2322452"},{name:"Dan", phone:"8768768"} |
+---------------+-------------------------------------------------------------+
Run Code Online (Sandbox Code Playgroud)
myu*_*suf 62
使用较新版本的MySQL,您可以使用JSON_OBJECT函数来实现所需的结果,如下所示:
GROUP_CONCAT(
JSON_OBJECT(
'name', name,
'phone', phone
)
) AS list
Run Code Online (Sandbox Code Playgroud)
要准备好将SQL响应解析为数组:
CONCAT(
'[',
GROUP_CONCAT(
JSON_OBJECT(
'name', name,
'phone', phone
)
),
']'
) AS list
Run Code Online (Sandbox Code Playgroud)
这将为您提供一个字符串:[{name: 'ABC', phone: '111'}, {name: 'DEF', phone: '222'}]可以对JSON进行解析.希望这可以帮助.
Mad*_*col 22
SELECT
email,
JSON_ARRAYAGG(
JSON_OBJECT(
'name', name,
'phone', phone
)
) AS list
FROM table1
GROUP BY email;
Run Code Online (Sandbox Code Playgroud)
+---------------+-------------------------------------------------------------------+
| email | list |
+---------------+-------------------------------------------------------------------+
| my1@gmail.com | [{"name":"Ben", "phone":6555333},{"name":"Joi", "phone":3434356}] |
| my2@gmail.com | [{"name":"Tom", "phone":2322452},{"name":"Dan", "phone":8768768}] |
+---------------+-------------------------------------------------------------------+
Run Code Online (Sandbox Code Playgroud)
唯一的区别是列list现在是Json-valid,因此您可以直接解析为Json
ale*_*orn 17
Devart的答案很棒,但K2xL的问题是有效的.我找到的答案是使用HEX()对名称列进行十六进制编码,这可确保它将创建有效的JSON.然后在应用程序中,将十六进制转换回字符串.
(对不起自我推销,但是)我写了一篇关于这个的小博客文章,更详细一点:http: //www.alexkorn.com/blog/2015/05/hand-rolling-valid-json-in-的MySQL-使用-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
Run Code Online (Sandbox Code Playgroud)
另请注意,我已添加COALESCE,以防该电子邮件没有任何项目.
Mat*_*mik 11
我希望这能找到合适的眼睛。
您可以使用:
对于数组(文档):
JSON_ARRAYAGG(col_or_expr) as ...
Run Code Online (Sandbox Code Playgroud)
对于对象(文档):
JSON_OBJECTAGG(key, value) as ...
Run Code Online (Sandbox Code Playgroud)
与上面 Madacol 的答案类似,但略有不同。除了 JSONARRAYAGG,您还可以 CAST AS JSON:
SELECT
email,
CAST( CONCAT(
'[',
GROUP_CONCAT(
JSON_OBJECT(
'name', name,
'phone', phone
)
),']') AS JSON )
FROM table1
GROUP BY email;
Run Code Online (Sandbox Code Playgroud)
结果:
+---------------+-------------------------------------------------------------------+
| email | list |
+---------------+-------------------------------------------------------------------+
| my1@gmail.com | [{"name":"Ben", "phone":6555333},{"name":"Joi", "phone":3434356}] |
| my2@gmail.com | [{"name":"Tom", "phone":2322452},{"name":"Dan", "phone":8768768}] |
+---------------+-------------------------------------------------------------------+
Run Code Online (Sandbox Code Playgroud)