SQL MAX столбца, включая его первичный ключ
-
03-07-2019 - |
Вопрос
Короткий:
Из приведенного ниже sql select я получаю cart_id и значение максимально ценного товара в этой корзине.
SELECT CartItems.cart_id, MAX(ItemValues.value)
FROM CartItems
INNER JOIN ItemValues
ON CartItems.item_id=ItemValues.item_id
GROUP BY CartItems.cart_id
но мне также нужен item_id для этого элемента (ItemValues.item-id).
Длинный:
Две таблицы, cartItems, ItemValues (и их соответствующие корзины, Items, здесь неуместны).
В каждой корзине может быть несколько товаров, где каждый товар имеет одно значение, определенное в ItemValues.
Каждый товар принадлежит к одной корзине.
Стоимость корзины - это стоимость товара с максимальной стоимостью в корзине.
Как мне выбрать cart-id, max (значение товара) и соответствующий идентификатор товара?
Например, идентификатор корзины A содержит идентификатор товара X со значением 10 и идентификатор товара Y со значением 90.
С помощью приведенного выше sql select я получаю,
A, 90Что мне нужно, так это
A, Y, 90
Платформа:MS SQL
Решение
В MS SQL
и Oracle
:
SELECT *
FROM
(
SELECT ci.*, iv.*,
ROW_NUMBER() OVER (PARTITION BY CartItems.cart_id ORDER BY ItemValues.value DESC)
FROM CartItems ci
INNER JOIN ItemValues iv
ON CartItems.item_id=ItemValues.item_id
) s
WHERE rn = 1
В MySQL
:
SELECT
FROM
(
SELECT ci.*,
(
SELECT id
FROM ItemValues iv
WHERE iv.item_id = ci.item_id
ORDER BY
value DESC
LIMIT 1
) AS maxitem
FROM CartItems ci
) iv, ItemValues ivo
WHERE ivo.id = iv.maxitem
Другие советы
Этот код был написан для Oracle, но должен быть совместим с большинством версий SQL:
Это возвращает значение max (high_val) и его ключ.
select high_val, my_key
from (select high_val, my_key
from mytable
where something = 'avalue'
order by high_val desc)
where rownum <= 1
Что здесь говорится, так это:Отсортируйте mytable по high_val по убыванию значений, где something = 'avalue'.Берите только верхнюю строку, которая предоставит вам максимальное значение (high_val) в выбранном диапазоне и my_key для этой таблицы.