MySQL находит самое дорогое в каждом почтовом индексе

У меня есть таблица под названием «Продукты» со схемой (имя, город, штат, цена zip_code).

И я хочу найти самые дорогие названия продуктов для каждого zip_code данного штата.

я написал

SELECT zip_code, MAX(price)
FROM products
WHERE products.state = 'NJ'
GROUP BY zip_code

как подзапрос, но я не мог понять, как отображать название продукта и цену за zip_code в «Нью-Джерси»

Я был бы признателен, если бы вы могли мне помочь, спасибо.


person CanCeylan    schedule 02.04.2012    source источник
comment
возможный дубликат выбора первых N строк для каждой группы в таблица   -  person Marc B    schedule 02.04.2012
comment
SELECT name, zip_code, MAX(price) ... не получилось?   -  person hjpotter92    schedule 02.04.2012
comment
@TheJumpingFrog: это не возвращает записи, относящиеся к MAX(price), а просто возвращает произвольную запись из каждой группы.   -  person mellamokb    schedule 02.04.2012


Ответы (4)


Это должно работать, хотя я не могу ручаться за его эффективность. Согласно комментарию, вот обновление, которое извлекает все записи с ценой, равной максимальной цене за почтовый индекс.

SELECT *
  FROM products p1
 WHERE p1.state = 'NJ'
   AND p1.price = (select max(price) from products p2
                   where p1.zip_code = p2.zip_code)

http://www.sqlfiddle.com/#!2/98f6d/2

person mellamokb    schedule 02.04.2012
comment
да, я думаю, что это сработает, но единственная проблема в том, что я хочу найти все продукты, цена которых максимальна, а не только топ - person CanCeylan; 02.04.2012
comment
Righto, обновлено, чтобы соответствовать цене, а не только первой записи. Хотя я думаю, что решение @safarov лучше. - person mellamokb; 02.04.2012

Что-то вроде этого:

SELECT name,price,zip_code
FROM products
WHERE state='NJ' AND price=(SELECT MAX(price) FROM products)
person Dickriven Chellemboyee    schedule 02.04.2012
comment
Я тоже думаю, что это не поможет. Он просто перешлет имя объекта с максимальной ценой - person hjpotter92; 02.04.2012

Я думаю, что вам (в любом случае) понадобится составной индекс для products.state,products.zip_code.

Попробуйте следующее:

SELECT p.zip_code, MAX(p.price) AS max_price, 
(
  SELECT GROUP_CONCAT(CAST(products.id AS CHAR)) FROM products 
  WHERE products.state = 'NJ' AND 
  products.zip_code = p.zip_code AND products.price = MAX(p.price) 
) AS product_ids
FROM products p WHERE p.state = 'NJ' GROUP BY p.zip_code ORDER BY NULL

Примечание.
GROUP_CONCAT имеет ограничение на максимальную длину результирующей строки, см. http://dev.mysql.com/doc/refman/5.0/en/server-system-variables.html#sysvar_group_concat_max_len . Если вам не хватает некоторых идентификаторов, это может быть причиной.

person georgepsarakis    schedule 02.04.2012

person    schedule
comment
@safarov: Почему ты удалил свой ответ? - person ypercubeᵀᴹ; 02.04.2012