是的,可以显示与每个用户的最高出价对应的行。
从做@Bryan Moyles 建议的开始;按用户汇总您的出价。
SELECT user_id, MAX(bamount) bamount
FROM table_name
GROUP BY user_id
现在您知道每个用户的最高出价。接下来,您需要通过将原始表连接到摘要来检索整行。
SELECT t.id, t.auc_id, t.user_id, t.bamount, t.date, t.out
FROM table_name t
INNER JOIN (
SELECT user_id, MAX(bamount) bamount
FROM table_name
GROUP BY user_id
) m ON t.user_id = m.user_id AND t.bamount = m.bamount
这几乎是正确的。但是,如果您有一个用户在两次不同的拍卖中出价完全相同,您将获得该用户的两行。您的问题没有指定您需要对这个特殊的边缘情况做什么。
这个怎么样?在两个出价金额相同的情况下,让我们为用户给出最近的(即具有最大数字 id 的那个)出价。所以,我们需要另一个摘要查询,就像这样。
SELECT w.user_id, MAX(w.id) id
FROM table_name w
INNER JOIN (
SELECT user_id, MAX(bamount) bamount
FROM table_name
GROUP BY user_id
) x ON w.user_id = x.user_id AND w.bamount = x.bamount
GROUP BY w.user_id
现在您将该查询加入到您的原始表中,您瞧,您已经完成了。不要忘记在这个整体查询中使用适当的 ORDER BY 子句。
这假定 id 是主键唯一列。
SELECT t.id, t.auc_id, t.user_id, t.bamount, t.date, t.out
FROM table_name t
INNER JOIN (
SELECT w.user_id, MAX(w.id) id
FROM table_name w
INNER JOIN (
SELECT user_id, MAX(bamount) bamount
FROM table_name
GROUP BY user_id
) x ON w.user_id = x.user_id AND w.bamount = x.bamount
GROUP BY w.user_id
) m ON t.id = m.id
看看情况如何?有一个摘要可以找到用户的最大数字出价。它嵌套在一个摘要中,为每个用户找到最大的 ID 号。它反过来用于从原始表中选择您需要的行。
通过利用比您在问题中给出的更好地理解您的数据,可能有更简单的方法来实现这一目标。例如,如果您知道出价总是在增加,并且没有两个出价的日期相同,并且您不关心如果用户对不止一个出价进行正确的拍卖,那么您可以只用日期字段。但是,根据我的经验,最好避免依赖关于您的数据的假设(例如出价总是在增加),因为现实生活中的事情会变得很糟糕。