MySQL在每个邮政编码中找到最昂贵的邮件

时间:2012-04-02 18:47:14

标签: mysql aggregate-functions

我有一个名为Products的表,其中包含架构(名称,城市,州,zip_code价格)。

我想找到给定州的每个zip_code最贵的产品名称。

我写了

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

作为子查询,但我无法确定在'NJ'中显示每个zip_code的产品名称和价格

如果你能帮助我,我将不胜感激 感谢。

4 个答案:

答案 0 :(得分:3)

这应该有效,但我不能保证它的效率。根据评论,这是一个更新,它将所有记录的价格等同于每个邮政编码的最大价格。

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

答案 1 :(得分:2)

SELECT
      t.name, t.city, t.zip_code, t.price
FROM  
       ( SELECT zip_code
              , MAX(price) as price 
         FROM products 
         WHERE state = 'NJ' 
         GROUP BY zip_code
       ) AS tm 
    JOIN
        products as t
            ON  tm.zip_code = t.zip_code 
            AND tm.price = t.price
WHERE 
        t.state = 'NJ' 

答案 2 :(得分:0)

这样的事情:

SELECT name,price,zip_code
FROM products
WHERE state='NJ' AND price=(SELECT MAX(price) FROM products)

答案 3 :(得分:0)

我认为您将(无论哪种方式)需要 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。如果您缺少某些ID,可能就是原因。