2012-07-26 237 views
2

我当前正试图将一些数据拖入表中,但我只想显示某一行,如果它包含列中的最高金额。只显示最高金额

+----+--------+---------+---------+----------+-----+ 
| 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 | 
+----+--------+---------+---------+----------+-----+ 

我想在表中的最新行对每个user_ID的每个auc_id

显示

使用户对auc_id 10002用户10008将显示16 bamount只能在表而忽略bamount 12行,因为12小于16

这可能吗?

回答

2

是的,它可以显示对应于每个用户的最高出价行。

从@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号码。它反过来被用来从你的原始表中选择你需要的行。

通过利用对数据的更好理解,可能会有更简单的方法来解决这个问题。例如,如果您知道出价总是增加,并且没有两个出价具有相同的日期,并且您不关心如果用户在多个出价上进行出价而获得正确的拍卖,那么您可以通过日期字段。但是,根据我的经验,最好避免依赖对数据的假设(例如出价不断增加),因为事情在现实生活中会变得越来越糟糕。

+0

谢谢,这是我在堆栈溢出时遇到的最佳答案!只是一个小问题 - 在哪里?物品从哪里来?我已阅读并且无法看到它们的定义:s – 2012-07-27 14:49:25

+0

这是一个表别名。我做了'INNER JOIN(等等等等)。 – 2012-07-27 16:20:30

0

使用MAX函数来获得最高的bamount

SELECT user_id, MAX(bamount) FROM table_name GROUP BY user_id 
+1

关闭。您需要按照OP的要求'按auc_id,user_id'进行分组''我想在表格中显示每个auc_id的每个user_id的最近一行' – mellamokb 2012-07-26 17:31:43

+0

懒惰的错误,感谢您的敏锐目光! – Bryan 2012-07-26 17:36:44

0
select * from table1 t 
where auction_date = (select max(auction_date) from table1 where 
          user_id = a.user_id and auc_id = a.auc_id) 

您的索引顺序是:Auction_date,user_id,auc_id。 Aution_date应该是索引中的列。