Mysql 使用MAX()函数获得相等值的附加条件

Mysql 使用MAX()函数获得相等值的附加条件,mysql,sql,group-by,Mysql,Sql,Group By,我有一个简单的拍卖数据库。它包括一个包含投标的表 +---------+---------+--------+------------+ | item_id | user_id | amount | time | +---------+---------+--------+------------+ | 3 | 2 | 500 | 1540152972 | | 3 | 4 | 500 | 1540151466 | +----

我有一个简单的拍卖数据库。它包括一个包含投标的表

+---------+---------+--------+------------+
| item_id | user_id | amount |    time    |
+---------+---------+--------+------------+
|       3 |       2 |    500 | 1540152972 |
|       3 |       4 |    500 | 1540151466 |
+---------+---------+--------+------------+
在拍卖结束时,我需要找出哪些用户赢得了哪些物品的最高金额。为此,我考虑了以下问题

SELECT item_id, user_id, MAX(amount)
FROM auction_bids
GROUP BY item_id
在多个用户以相同的金额出价之前,它似乎工作正常

在这种情况下,我需要检索最早的一个,即:最低时间值


如何通过查询将其输入到我的组中?

否,这是筛选,而不是聚合:

SELECT ab.*
FROM auction_bids ab
WHERE ab.amount = (SELECT MAX(ab2.amount)
                   FROM auction_bids ab2
                   WHERE ab2.item_id = ab.item_id
                  );

不,这是筛选,不是聚合:

SELECT ab.*
FROM auction_bids ab
WHERE ab.amount = (SELECT MAX(ab2.amount)
                   FROM auction_bids ab2
                   WHERE ab2.item_id = ab.item_id
                  );

如果没有其他具有相同item_id的行具有更高的价格,则返回一行;如果价格相同,则返回另一行

SELECT item_id, user_id, amount
FROM auction_bids a1
WHERE NOT EXISTS (select 1 from auction_bids a2
                  where a2.item_id = a1.item_id
                    and (a2.amount > a1.amount
                         or (a2.amount = a1.amount and a2.time < a1.time)))

如果没有其他具有相同item_id的行具有更高的价格,则返回一行;如果价格相同,则返回另一行

SELECT item_id, user_id, amount
FROM auction_bids a1
WHERE NOT EXISTS (select 1 from auction_bids a2
                  where a2.item_id = a1.item_id
                    and (a2.amount > a1.amount
                         or (a2.amount = a1.amount and a2.time < a1.time)))

您使用的是哪个MySQL版本?您的查询无论如何都是错误的。您可以按项目\u id分组,但选择用户\u id,而不指定用户。所以,你只要在每一个任意选择的项目中找到一个投标人。其他DBMS会引发错误,但MySQL会以静默方式将用户id转换为任何用户id。您可能需要考虑SET SqLyMyLoad =“OnLyFulyGulpPyBy”来帮助您解决这些情况。您使用的是哪种MySQL版本?您可以按项目\u id分组,但选择用户\u id,而不指定用户。所以,你只要在每一个任意选择的项目中找到一个投标人。其他DBMS会引发错误,但MySQL会以静默方式将用户id转换为任何用户id。您可能需要考虑SET SqLyMyLoad =“OnLyFull GypPyBy”来帮助您解决这些情况。