2012-07-26 74 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應該是索引中的列。