Задавайте вопросы, мы ответим
Вы не зашли.
Страниц: 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