2012-09-20 7 views
21

Come si crea il formato JSON con mysql per concatenamento di gruppo?Come si crea il formato JSON con group-concat mysql?

(io uso MySQL)

Esempio 1:

Tabella 1:

email   | name | phone 
------------------------------------- 
[email protected] | Ben  | 6555333 
[email protected] | Tom  | 2322452 
[email protected] | Dan  | 8768768 
[email protected] | Joi  | 3434356 

come il codice sintassi che non mi danno il formato:

select email, group-concat(name,phone) as list from table1 group by email

uscita che ho necessità:

email   | list 
------------------------------------------------ 
[email protected] | {name:"Ben",phone:"6555333"},{name:"Joi",phone:"3434356"} 
[email protected] | {name:"Tom",phone:"2322452"},{name:"Dan",phone:"8768768"} 

Grazie

+1

Se il database è destinato a crescere, questa è una cattiva idea. Meglio farlo usando il codice nella tua applicazione. –

+0

db static per readonly parpose – Yosef

risposta

35

Prova questa ricerca -

SELECT 
    email, 
    GROUP_CONCAT(CONCAT('{name:"', name, '", phone:"',phone,'"}')) list 
FROM 
    table1 
GROUP BY 
    email; 

JSON risultato formato -

+---------------+-------------------------------------------------------------+ 
| email   | list              | 
+---------------+-------------------------------------------------------------+ 
| [email protected] | {name:"Ben", phone:"6555333"},{name:"Joi", phone:"3434356"} | 
| [email protected] | {name:"Tom", phone:"2322452"},{name:"Dan", phone:"8768768"} | 
+---------------+-------------------------------------------------------------+ 
+0

grazie mille – Yosef

+3

cosa succederebbe se il nome contenga una virgoletta doppia? – K2xL

+0

Dipende dalla modalità SQL ANSI_QUOTES, se è attivata - allora si dovrebbe raddoppiare "nei nomi, altrimenti funzionerà. – Devart

1

Usa come questo

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

Cheers

10

La risposta di Devart sopra è ottima, ma la domanda di K2xL è valida. La risposta che ho trovato è stata la codifica esadecimale della colonna del nome usando HEX(), che garantisce che creerà JSON valido. Quindi, nell'applicazione, convertire il retro esadecimale nella stringa.

(Ci scusiamo per l'auto-promozione, ma) ho scritto un po 'di post su questo blog con un po' più in dettaglio: http://www.alexkorn.com/blog/2015/05/hand-rolling-valid-json-in-mysql-using-group_concat/

[Modifica per Oriol] Ecco un esempio:

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 

Nota anche che ho aggiunto un COALESCE nel caso in cui non ci siano articoli per quell'e-mail.

+0

beh, questo è il Grazie! – serkan

+0

Aggiungete l'esempio di concatenamento complesso nella vostra risposta. Penso che sia molto utile ;-) – Oriol

+0

Questo ha risolto il mio problema, altre soluzioni non sono riuscite quando decodifica il json risultante con caratteri non validi come schede, barre, ... – Mirko

18

Con le versioni più recenti di MySQL, è possibile utilizzare la funzione JSON_OBJECT per ottenere il risultato desiderato, in questo modo:

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

Speranza che aiuta.

0

Disconnessione da @ Devart's answer ... se il campo contiene interruzioni di riga o virgolette doppie, il risultato non sarà JSON valido.

Quindi, se conosciamo il campo "telefono" contiene di tanto in tanto virgolette e le interruzioni di linea, la nostra SQL sarà simile:

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

Se Ben telefono è dotato di una citazione nel mezzo di esso, e Joi di ha un ritorno a capo, la SQL darebbe risultati (valido JSON) come:

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