2012-09-20 20 views
21

如何使用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"} 

感谢

+1

,这是一个坏主意。最好在你的应用程序中使用代码。 –

+0

db static for readonly parpose – Yosef

回答

35

尝试此查询 -

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"} | 
+---------------+-------------------------------------------------------------+ 
+0

非常感谢你 – Yosef

+3

如果名称包含双引号会发生什么? – K2xL

+0

它取决于ANSI_QUOTES SQL模式,如果它被激活 - 那么你应该加倍“在名称中,othervise - 它会工作。 – Devart

1

使用这样

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

Cheers

10

Devart的回答很好,但是K2xL的问题是有效的。我找到的答案是使用HEX()对名称列进行十六进制编码,从而确保它将创建有效的JSON。然后在应用程序中,将十六进制转换回字符串。

(对不起,自我宣传,但)我写了一个小博客文章就这个问题与更详细一点: http://www.alexkorn.com/blog/2015/05/hand-rolling-valid-json-in-mysql-using-group_concat/

[编辑为奥里奥尔]下面是一个例子:

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。

+0

好吧,那是解决方法。谢谢! – serkan

+0

在你的答案中添加复杂的concat示例,我认为这非常有帮助;-) – Oriol

+0

这解决了我的问题,其他解决方案在解析生成的具有无效字符的json时失败标签,斜杠,... – Mirko

18

随着MySQL的较新版本,您可以使用JSON_OBJECT功能来达到预期的效果,像这样:

GROUP_CONCAT(
    JSON_OBJECT(
    'name', name, 
    'phone', phone 
) 
) AS list 

希望有所帮助。

0

从@ Devart的答案开始......如果该字段包含换行符或双引号,则结果将不是有效的JSON。

所以,如果我们知道了“手机”领域偶尔包含双引号和换行符,我们的SQL就像:

SELECT 
    email, 
    CONCAT(
    '[', 
    GROUP_CONCAT(CONCAT(
     '{name:"', 
     name, 
     '", phone:"', 
     REPLACE(REPLACE(phone, '"', '\\\\"'),'\n','\\\\n'), 
     '"}' 
    )), 
    ']' 
) AS list 
FROM table1 GROUP BY email;

如果本手机在它的中间报价,并淳佳的有换行,那么SQL会给(有效的JSON)的结果一样:如果你的数据库是要成长

[{name:"Ben", phone:"655\"5333"},{name:"Joi", phone:"343\n4356"}]