Как создать формат json с помощью group-concat mysql?
как создать формат json с помощью group-concat mysql?
(Я использую 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
как синтаксический код, который не дает мне формат:
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"}
спасибо
5 ответов
попробуйте выполнить этот запрос -
SELECT
email,
GROUP_CONCAT(CONCAT('{name:"', name, '", phone:"',phone,'"}')) list
FROM
table1
GROUP BY
email;
результат формата 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"} |
+---------------+-------------------------------------------------------------+
С более новыми версиями MySQL вы можете использовать функцию JSON_OBJECT для достижения желаемого результата, например:
GROUP_CONCAT(
JSON_OBJECT(
'name', name,
'phone', phone
)
) AS list
чтобы получить ответ SQL готов к анализу в виде массива:
CONCAT(
'[',
GROUP_CONCAT(
JSON_OBJECT(
'name', name,
'phone', phone
)
),
']'
) AS list
Это даст вам строку вида: [{name: 'ABC', phone: '111'}, {name: 'DEF', phone: '222'}]
который может быть проанализирован JSON. Надеюсь, это поможет.
ответ Деварта выше велик, но вопрос K2xL действителен. Ответ, который я нашел, был шестнадцатеричным-кодировать столбец name с помощью HEX (), который гарантирует, что он создаст действительный JSON. Затем в приложении преобразуйте шестнадцатеричную цифру обратно в строку.
(извините за саморекламу, но) я написал немного в блоге об этом немного больше деталь: http://www.alexkorn.com/blog/2015/05/hand-rolling-valid-json-in-mysql-using-group_concat/
[Edit for 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
также обратите внимание, что я добавил объединение, если для этого письма нет элементов.
уход от ответа @Devart... если поле содержит строки или двойные кавычки, результат не будет допустимым JSON.
Итак, если мы знаем, что поле "телефон" иногда содержит двойные кавычки и linebreaks, наш SQL будет выглядеть так:
SELECT email, CONCAT( '[', GROUP_CONCAT(CONCAT( '{name:"', name, '", phone:"', REPLACE(REPLACE(phone, '"', '\\"'),'\n','\\n'), '"}' )), ']' ) AS list FROM table1 GROUP BY email;
Если у Ben phone есть цитата в середине, а у Joi есть новая строка, SQL даст (действительный JSON) результаты, такие как:
[{name:"Ben", phone:"655\"5333"},{name:"Joi", phone:"343\n4356"}]
используйте вот так
SELECT email,concat('{name:"',ur_name_column,'",phone:"',ur_phone_column,'"}') as list FROM table1 GROUP BY email;
Ура