2012-09-20 19 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"}]