选择多个最大值

时间:2010-08-28 11:13:51

标签: mysql select group-by max

我有一个名为order的表格,其中包含iduser_idpriceitem_id列。商品价格不固定,我想选择每件商品最贵的订单。我想在同一个查询中选择user_iditem_idprice。我尝试了以下查询,但它没有返回正确的结果集。

SELECT user_id, item_id, MAX(price)
FROM order
GROUP BY item_id

此查询返回的某些行具有错误的user_id。但是,结果集中的所有行都显示每个项目的正确最高价格。

8 个答案:

答案 0 :(得分:9)

您可能希望使用派生表,如下所示:

SELECT    o1.item_id, o1.max_price, o2.user_id user_of_max_price
FROM      (
             SELECT item_id, MAX(price) max_price
             FROM `order`
             GROUP BY item_id
          ) o1
JOIN      `order` o2 ON (o2.price = o1.max_price AND o2.item_id = o1.item_id)
GROUP BY  o1.item_id;

测试用例:

CREATE TABLE `order` (user_id int, item_id int, price decimal(5,2));

INSERT INTO `order` VALUES (1, 1, 10);
INSERT INTO `order` VALUES (1, 2, 15);
INSERT INTO `order` VALUES (1, 3, 8);
INSERT INTO `order` VALUES (2, 1, 20);
INSERT INTO `order` VALUES (2, 2, 6);
INSERT INTO `order` VALUES (2, 3, 15);
INSERT INTO `order` VALUES (3, 1, 18);
INSERT INTO `order` VALUES (3, 2, 13);
INSERT INTO `order` VALUES (3, 3, 10);

结果:

+---------+-----------+-------------------+
| item_id | max_price | user_of_max_price |
+---------+-----------+-------------------+
|       1 |     20.00 |                 2 |
|       2 |     15.00 |                 1 |
|       3 |     15.00 |                 2 |
+---------+-----------+-------------------+
3 rows in set (0.00 sec)

答案 1 :(得分:3)

也许这会有点长,但你的可读性会提高

SELECT
        *
FROM
    `order`
JOIN
    (
        SELECT 
            item_id, 
            MAX(price) price 
        FROM 
            `order` 
        GROUP BY 
            item_id
    ) 
    USING(item_id, price);

答案 2 :(得分:2)

您需要先获取每个商品ID的最高价格,然后再加入order以获取最高价格订购商品的记录。像下面的查询应该工作。虽然,它将返回所有具有最大商品价格的记录。

SELECT user_id, item_id, price
FROM order o
JOIN (
        SELECT item_id, max(price) max_price
        FROM order
        GROUP BY item_id
     ) o2 
  ON o.item_id = o2.item_id AND o.price = o2.max_price;

答案 3 :(得分:2)

这是一个每组最大的问题。这个常见问题有various approaches。在MySQL上,使用null-self-join通常比涉及子查询的任何内容更快更简单:

SELECT o0.user_id, o0.item_id, o0.price
FROM order AS o0
LEFT JOIN order AS o1 ON o1.item_id=o0.item_id AND o1.price>o0.price
WHERE o1.user_id IS NULL

即。 “选择具有较高价格的同一物品不存在其他行的每一行”。

(如果两行具有相同的最高价格,则返回两者。在平局情况下,究竟要做什么是每组最大解决方案的一般问题。)

答案 4 :(得分:2)

SELECT user_id, item_id, MAX(price) 
FROM order
GROUP BY item_id

您使用的SQL与GROUP相矛盾。 一旦你使用GROUP,MYSQL将始终选择FIRST user_id,但最高价格,这就是用户错误但价格合适的原因。

您可以尝试添加ORDER BY price DESC以查看发生的情况,但我没有在我的环境中尝试。

答案 5 :(得分:1)

您的查询按item_id对行进行分组。如果您有多个item_id 1项,且user_id不同,则只会选择第一个user_id,而不会选择价格最高的user_id

答案 6 :(得分:0)

您需要按item_id和user_id分组(显示每个用户的每个项目的最高价格),或者如果您只想要组中的项目,则需要重新考虑user_id列。 例如显示商品的最高价格,并显示对价格进行更改的最新用户,或显示商品的最高价格,并显示为商品的最高价格制作的用户等。查看{{3}对于这样做的一些模式。

答案 7 :(得分:0)

如果您想从订单中获得前2名,请尝试此...

如果你想要前三名,那就改变最后一个条件 其中item_rank in (1,2) ;where item_rank in (1,2,3) ;

select * from 
    (select  item_id  , price
    , @curRow % @curNval  as item_rank
    ,  @curRow := @curRow + 1 AS row_number
    from `order` ,   (SELECT @curRow := 1 , @curNval := 3 ) r  
    order by  item_id , price desc  ) tab  where item_rank in (1,2) ;