mysql - 在多行表格中选择最高出价
问题描述
我正在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 的情况下获得正确的结果?
解决方案
要解决这个每组前 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
推荐阅读
- html - Anki Cards 中的 HTML 条件样式
- vbscript - UFT-Insight 对象
- java - 创建 Spring Boot 应用程序时出错
- django - 社区网站上应该有身份验证吗?
- javascript - react scrollTo 不是一个函数
- nginx - phpmyadmin 未加载 png(图像) nginx
- android - Firebase 嵌套子项的 Recycleview 无法显示
- javascript - 在加载视图或显示页面时使用进度条
- apache-kafka - Spring Cloud Stream Kafka Binder autoCommitOnError=false 得到意外行为
- php - 访问代码中的应用程序 url 时 Laravel 5 配置缓存问题