У меня есть таблица MySQL: Комбинированная колонка - это тип данных JSON
id | combo
1 | {"qty": "2", "variations": [{"name": "Cover", "value": "Paperback"}], "price": "14.00"}
2 | {"qty": "1", "variations": [{"name": "Cover", "value": "Hardback"}], "price": "7.00"}
3 | {"qty": "1", "variations": [{"name": "Cover", "value": "Paperback"}], "price": "15.00"}
Я пытаюсь получить MIN()
цена 7.00
но, поскольку они строки, он возвращает 14.00
.
Это можно сделать? Вот что я пробовал:
SELECT
JSON_UNQUOTE(MIN(combo->'$.price')) AS min_price
FROM itemListings
GROUP BY id
Я также попытался удалить котировки вокруг сохраненных цен, но он дал те же результаты.
Ваш код дает вам лексикографический минимум; при сортировке строк "1"
появляется перед "7"
, несмотря на то, что строки "14.00"
и "7:00"
, так же, как "apple"
появляется перед "bat"
, несмотря на то, что "apple"
длиннее, чем "bat"
.
Вы хотите числовой минимум, поэтому приведите значение к десятичному числу:
SELECT
id, -- you probably want the select the grouped by value too
MIN(CAST(combo->'$.price' AS DECIMAL(10,2))) AS min_price
FROM itemListings
GROUP BY id