Jak utworzyć format json z group-concat mysql?
Jak utworzyć format json z group-concat mysql?
(używam MySQL)
Przykład1:
Table1:
email | name | phone
-------------------------------------
[email protected] | Ben | 6555333
[email protected] | Tom | 2322452
[email protected] | Dan | 8768768
[email protected] | Joi | 3434356
Jak kod składniowy, który nie daje mi formatu:
select email, group-concat(name,phone) as list from table1 group by email
Wyjście, którego potrzebuję:
email | list
------------------------------------------------
[email protected] | {name:"Ben",phone:"6555333"},{name:"Joi",phone:"3434356"}
[email protected] | {name:"Tom",phone:"2322452"},{name:"Dan",phone:"8768768"}
Dzięki
5 answers
Spróbuj tego zapytania -
SELECT
email,
GROUP_CONCAT(CONCAT('{name:"', name, '", phone:"',phone,'"}')) list
FROM
table1
GROUP BY
email;
Wynik formatu JSON-
+---------------+-------------------------------------------------------------+
| email | list |
+---------------+-------------------------------------------------------------+
| [email protected] | {name:"Ben", phone:"6555333"},{name:"Joi", phone:"3434356"} |
| [email protected] | {name:"Tom", phone:"2322452"},{name:"Dan", phone:"8768768"} |
+---------------+-------------------------------------------------------------+
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-20 12:25:29
W nowszych wersjach MySQL, możesz użyć funkcji JSON_OBJECT, aby osiągnąć pożądany rezultat, jak tak:
GROUP_CONCAT(
JSON_OBJECT(
'name', name,
'phone', phone
)
) AS list
Aby uzyskać odpowiedź SQL gotową do przetworzenia w postaci tablicy:
CONCAT(
'[',
GROUP_CONCAT(
JSON_OBJECT(
'name', name,
'phone', phone
)
),
']'
) AS list
To da ci ciąg znaków taki jak: [{name: 'ABC', phone: '111'}, {name: 'DEF', phone: '222'}]
, który może być parsowany przez JSON. Mam nadzieję, że to pomoże.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-23 09:53:20
ODPOWIEDŹ Devarta powyżej jest świetna, ale pytanie K2xL jest poprawne. Odpowiedź, którą znalazłem, to kodowanie szesnastkowe kolumny nazwy za pomocą hex (), co zapewnia, że utworzy poprawny JSON. Następnie w aplikacji przekonwertować szesnastkowy z powrotem na łańcuch znaków.
(przepraszam za autopromocję, ale) napisałem o tym mały wpis na blogu z nieco bardziej szczegółowym: http://www.alexkorn.com/blog/2015/05/hand-rolling-valid-json-in-mysql-using-group_concat/
[edytuj dla Oriol] oto przykład:
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
Również zauważ, że dodałem KOALESCE w przypadku, gdy nie ma elementów dla tego e-maila.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-05 18:16:20
[[2]] wychodząc z @Devart ' s answer... jeśli pole zawiera znaki liniowe lub podwójne cudzysłowy, wynik nie będzie poprawny JSON.
Tak więc, jeśli wiemy, że pole" telefon " czasami zawiera podwójne cudzysłowy i linebreaks, nasz SQL wyglądałby następująco:
SELECT email, CONCAT( '[', GROUP_CONCAT(CONCAT( '{name:"', name, '", phone:"', REPLACE(REPLACE(phone, '"', '\\\\"'),'\n','\\\\n'), '"}' )), ']' ) AS list FROM table1 GROUP BY email;
Jeśli Ben phone ma cytat w środku, a Joi ma nową linię, SQL da (poprawny JSON) wyniki takie jak:
[{name:"Ben", phone:"655\"5333"},{name:"Joi", phone:"343\n4356"}]
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-24 21:41:31
Użyj tak
SELECT email,concat('{name:"',ur_name_column,'",phone:"',ur_phone_column,'"}') as list FROM table1 GROUP BY email;
Cheers
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-20 12:06:50