我有一个名为order
的表格,其中包含id
,user_id
,price
和item_id
列。商品价格不固定,我想选择每件商品最贵的订单。我想在同一个查询中选择user_id
,item_id
和price
。我尝试了以下查询,但它没有返回正确的结果集。
SELECT user_id, item_id, MAX(price)
FROM order
GROUP BY item_id
此查询返回的某些行具有错误的user_id
。但是,结果集中的所有行都显示每个项目的正确最高价格。
答案 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) ;