![]() |
|
Задавайте вопросы, мы ответим
Вы не зашли.
Страниц: 1

Внезапно я осознал, что не понимаю, как из поля типа JSON выбрать, например, наибольшее из значений.
CREATE TABLE test (
i INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
j JSON
);
INSERT INTO test (j) VALUES
('[10, 20, 30]'),
('[100, 500]');mysql> SELECT * FROM test; +---+--------------+ | i | j | +---+--------------+ | 1 | [10, 20, 30] | | 2 | [100, 500] | +---+--------------+
Как выглядит запрос, который для каждой записи выберет максимальное число из массивов в колонке j?
Неактивен
LazY, полагаю, тебе сюда смотреть
https://dev.mysql.com/doc/refman/8.0/en … json-table
Неактивен

Похоже, что такого типа функции в MySQL еще не поддерживаются. Задача похожа на вычисление суммы элементов массива JSON. Для этого предлагают написать хранимую функцию:
https://stackoverflow.com/a/45297362
Функция для MAX полностью аналогична.
Неактивен

Единственное решение здесь действительно через JSON_TABLE(), как все и говорили.
На мой взгляд, серьезная недоработка со стороны разработчиков MySQL:
1. Нужно добавлять в запрос не только дополнительную таблицу, но еще и группировку. Причем сходу не разберешься, как такой запрос надо писать, потому что JOIN тут необычный, а специально мутировавший для конкретно этого случая.
2. Таким образом нельзя построить виртуальные колонки и, как следствие, индексы по ним. Если нужно по такому сортировать, придется гонять по всей таблице ![]()
Оставлю тут наглядный пример. Может, кому пригодится:
Неактивен

Другой заковыристый пример - представление ассоциативного массива в виде таблицы.
Тут сложность в том, что ключи массива нельзя получить там же, где значения. Из-за этого нужно строить довольно замысловатые конструкции.
+----+------+------+-------+ | id | n | key | value | +----+------+------+-------+ | 1 | 1 | a | 1000 | | 1 | 2 | b | 2000 | | 1 | 3 | c | 3000 | | 2 | 1 | d | 4000 | | 2 | 2 | e | 5000 | +----+------+------+-------+
Здесь нужно иметь в виду следующие особенности:
1. Для получения ключей потребовался дополнительный JOIN с JSON_TABLE, причем в качестве корневого JSON-документа ему передается не сам массив, а его ключи - JSON_KEYS().
2. В обоих JOIN присутствует столбец типа FOR CARDINALITY.
Это специальный автоинкрементный столбец, значения которого генерируются автоматически. Для наглядности он включен в результат запроса.
В данном случае этот столбец понадобился, чтобы связать между собой два JOIN.
(В документации такое его использование не упоминается. Спасибо автору найденного на stackoverflow комментария.)
3. В качестве пути к значениям массива указан $., а не $[*], поскольку массив ассоциативный, а не числовой.
Неактивен
Страниц: 1