У меня есть таблица, и я хочу объединить строки на основе общего идентификатора

ID     file_id   quantity

3       1122       25
3       1123        3
4       1126        7
4       1127        1

Я хочу получить

ID     file_quantity_merged

3       {["file_id":1122, "quantity": 25],["file_id":1123, "quantity": 3]}
4       {["file_id":1126, "quantity": 7],["file_id":1127, "quantity": 1]}

Я не добавил никакой попытки кода, так как я не уверен, есть ли на сервере sql такой метод для динамического создания json, подобного этому SET @json, поскольку у меня большой файл. Любая помощь приветствуется.

1
Hari_pb 11 Апр 2019 в 19:27

2 ответа

Лучший ответ

Ваш желаемый результат не является допустимым JSON.

Вам нужен массив объектов, а не список разделенных запятыми массивов в фигурных скобках.

Пока вы используете версию, поддерживающую FOR JSON AUTO вы можете использовать

SELECT   ID,
         ( SELECT file_id, quantity
           FROM    YourTable T2
           WHERE   T2.ID = T1.ID FOR JSON AUTO ) AS file_quantity_merged
FROM     YourTable T1
GROUP BY ID

Что возвращается

+----+----------------------------------------------------------------+
| ID |                      file_quantity_merged                      |
+----+----------------------------------------------------------------+
|  3 | [{"file_id":1122,"quantity":25},{"file_id":1123,"quantity":3}] |
|  4 | [{"file_id":1126,"quantity":7},{"file_id":1127,"quantity":1}]  |
+----+----------------------------------------------------------------+
2
Martin Smith 11 Апр 2019 в 16:39

В дополнение к ответу выше, я пытался в более старой версии, где json не поддерживается, мы можем использовать метод group_concat для обработки таких ситуаций в MySQL:

SELECT  ID, GROUP_CONCAT(`file_id`, ':',
    `quantity` SEPARATOR ', ') as file_quantity_merged
    from TABLE_NAME GROUP BY id;

Output:-

ID     file_quantity_merged
3      "1122:25, 1123:3"
4      "1126:7, 1127:1"
1
Harry_pb 11 Апр 2019 в 18:37