2012-04-02 126 views
2

我有一个名为Products(模式名称,城市,州,zip_code价格)的表。MySQL在每个邮政编码中找到最贵的邮政编码

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

我写

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

一个子查询,但我无法弄清楚“NJ”

我将不胜感激,如果你能帮助我,谢谢 每ZIP_CODE显示的产品名称和价格。

+0

[为表中的每个组选择前N行]的可能重复(http://stackoverflow.com/questions/3998529/selecting-top-n-rows-for-each-group-in-a-table ) – 2012-04-02 18:50:37

+0

'SELECT name,zip_code,MAX(price)'...没有工作? – hjpotter92 2012-04-02 18:54:04

+2

@TheJumpingFrog:不会返回与MAX(价格)相关的记录,它只是返回每个组的任意记录。 – mellamokb 2012-04-02 18:55:18

回答

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' 
+1

@safarov:你为什么删除你的答案? – 2012-04-02 19:24:52

+0

我知道对,@萨法罗夫有最好的回答:) – mellamokb 2012-04-02 20:01:36

0

事情是这样的:

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

但它必须为每个邮政编码 – CanCeylan 2012-04-02 18:57:59

+1

我认为这也无济于事。它只会转发最高价格实体的名称 – hjpotter92 2012-04-02 18:58:21

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

+0

是的,我认为它会工作,但唯一的问题是,我想找到价格最高的所有产品,而不仅仅是最顶级的产品 – CanCeylan 2012-04-02 19:02:44

+0

右侧,更新以匹配价格只是第一个记录。虽然我想@ safarov的解决方案更好。 – mellamokb 2012-04-02 19:07:07

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,这可能是原因。