我目前正在尝试将一些数据拉入表中,但我只想显示某一行(如果它包含列中的最高数量)。
+----+--------+---------+---------+----------+-----+
| id | auc_id | user_id | bamount | date | out |
+----+--------+---------+---------+----------+-----+
| 20 | 10002 | 10008 | 12 |1342445619| 1 |
| 21 | 10002 | 10009 | 14 |1342445667| 1 |
| 22 | 10002 | 10008 | 16 |1342445669| 0 |
+----+--------+---------+---------+----------+-----+
我想在表中显示每个 auc_id 的每个 user_id 的最新行
因此,auc_id 10002 用户 10008 的用户将仅在表中显示 16 的 bamount,并忽略 12 行的 bamount,因为 12 小于 16
这可能吗?
最佳答案
是的,可以显示与每个用户的最高出价相对应的行。
首先按照@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 号。它反过来用于从原始表中选择您需要的行。
通过利用比您在问题中给出的更好的数据理解,可能有更简单的方法来实现这一目标。例如,如果您知道出价总是增加,并且没有两个出价具有相同的日期,并且如果用户对多个出价进行出价,您并不关心获得正确的拍卖,那么您可以通过以下方式进行总结:日期字段。但是,根据我的经验,最好避免依赖有关数据的假设(例如出价始终增加),因为现实生活中事情会变得很糟糕。
关于php - 仅显示最高金额,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11674684/