SQL MAX столбца, включая его первичный ключ - PullRequest
4 голосов
/ 04 марта 2009

Short:

Снизу sql выберите Я получаю 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).

Long:

Две таблицы, CartItems, ItemValues ​​(и соответствующие им тележки, Предметы, не относящиеся к делу).
Каждая корзина может иметь несколько предметов, тогда как у каждого предмета есть одно значение, определенное в ItemValues.
Каждый товар принадлежит одной корзине.
Стоимость корзины - это стоимость товара с максимальным значением в его корзине.
Как выбрать идентификатор корзины, максимум (значение элемента) и соответствующий идентификатор элемента?

Например, идентификатор корзины A содержит идентификатор элемента X со значением 10 и идентификатор элемента Y со значением 90.
С вышеупомянутым выбором SQL я получаю,

A, 90
Что мне нужно, это
A, Y, 90


платформа: MS SQL

Ответы [ 2 ]

4 голосов
/ 04 марта 2009

В 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
1 голос
/ 28 августа 2012

Этот код был написан для Oracle, но должен быть совместим с большинством версий SQL:

Получает максимум (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 по значениям, где что-то = 'avalue'. Возьмите только верхнюю строку, которая предоставит вам max (high_val) в выбранном диапазоне и my_key для этой таблицы.

...