首页 > 解决方案 > 在多行表格中选择最高出价

问题描述

我正在bids为市场使用一张桌子,并试图获得用户的最高出价。用户可以多次出价(金额增加),因此我只想要每个列表项的最高出价。

+----+------------+---------+--------+
| id | listing_id | user_id | amount |
+----+------------+---------+--------+
|  1 |          1 |       1 |      5 |
|  2 |          2 |       1 |     10 |
|  3 |          2 |       1 |     15 |
+----+------------+---------+--------+

我希望最终结果是:

+----+------------+---------+--------+
| id | listing_id | user_id | amount |
+----+------------+---------+--------+
|  1 |          1 |       1 |      5 |
|  3 |          2 |       1 |     15 |
+----+------------+---------+--------+

我尝试了以下查询:

select bids.id, bids.listing_id, bids.user_id, max(bids.amount) as amount 
from bids 
group by listing_id;

但这给了我以下(对我而言)奇怪的结果:

+----+------------+---------+--------+
| id | listing_id | user_id | amount |
+----+------------+---------+--------+
|  1 |          1 |       1 |      5 |
|  2 |          2 |       1 |     15 |
+----+------------+---------+--------+

金额 15 是正确的,但 ID=2 来自金额=10 的记录。如何在记录 id=1 和 id=3 的情况下获得正确的结果?

标签: mysqlsqlgreatest-n-per-group

解决方案


要解决这个每组前 1 个问题,您需要过滤而不是聚合

这是使用相关子查询的一种方法:

select b.*
from bids b
where b.amount = (
    select max(b1.amount) 
    from bids 
    where b1.listing_id = b.listing_id and b1.user_id = b.user_id
)

另一个典型的解决方案是使用反left join

select b.*
from bids b
left join bids b1 
    on b1.listing_id = b.listing_id and b1.user_id = b.user_id and b1.amount > b.amount
where b1.id is null

推荐阅读