#mysql #json
#mysql #json
Вопрос:
У меня есть эти строки в таблице mysql
id categoryNameSp categoryNameEn
1 Comida Food
2 Fruta Fruit
3 Fruta Seca Dried fruit
И затем у меня есть эта строка в другой таблице
pid path
1 ["1", "2", "3"]
Я хочу вернуть путь, но вместо чисел я хочу вернуть categoryNameEn, поэтому возврат будет:
pid path
1 ["Food","Fruit", "Dried fruit"]
Комментарии:
1. Из любопытства, почему вы решили сохранить пути в массиве JSON, если вы хотели выполнять подобные запросы, которые обрабатывают элементы массива как дискретные значения?
2. Извините за поздний ответ, цель состояла в том, чтобы разрешить поиск по категориям, который рассматривал бы все выбранные категории точно так же, как система папок Windows. Поэтому на стороне клиента я сохраняю все выбранные категории, а затем возвращаю результат с помощью функции mysql json_contains() .
3. Но почему бы не сохранить каждое значение пути в отдельной строке? Тогда было бы намного проще выполнить соединение с таблицей категорий без использования сложных функций JSON.
4. Поступая таким образом, я был бы вынужден определить количество столбцов, и поэтому мне пришлось бы определить максимальное количество подкатегорий, но с помощью json я управляю всем на стороне клиента, и я могу управлять этим, если обнаружу, что путь завершен
Ответ №1:
Для этого потребуется использовать функциональность JSON_TABLE, а также функцию агрегирования JSON_ARRAYAGG.
Воссоздаем вашу ситуацию, используя следующие DML и DDL:
CREATE TABLE categories (id INT, name VARCHAR(30));
INSERT INTO categories VALUES (1, 'Food'), (2, 'Fruit'), (3, 'Dried Fruit');
CREATE TABLE stuff (pid INT, path JSON);
INSERT INTO stuff VALUES (1, '["1", "2", "3"]');
Затем мы можем выполнить следующий (необычный) запрос:
SELECT pid, JSON_ARRAYAGG(c.name) FROM stuff AS s
JOIN JSON_TABLE(s.path, '$[*]' COLUMNS (category INT PATH '
Идея состоит в том, чтобы создать таблицу из данных JSON, найденных в stuff
таблице. Затем мы объединяем его с таблицами категорий и объединяем результат в массив JSON.
Результат:
------ ----------------------------------
| pid | JSON_ARRAYAGG(c.name) |
------ ----------------------------------
| 1 | ["Food", "Fruit", "Dried Fruit"] |
------ ----------------------------------
Идея состоит в том, чтобы создать таблицу из данных JSON, найденных в
)) AS cats
JOIN categories AS c ON cats.category = c.id
GROUP BY pid;
stuff
таблице. Затем мы объединяем его с таблицами категорий и объединяем результат в массив JSON.
Результат: