是的,它可以顯示對應於每個用戶的最高出價行。
從@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號碼。它反過來被用來從你的原始表中選擇你需要的行。
通過利用對數據的更好理解,可能會有更簡單的方法來解決這個問題。例如,如果您知道出價總是增加,並且沒有兩個出價具有相同的日期,並且您不關心如果用戶在多個出價上進行出價而獲得正確的拍賣,那麼您可以通過日期字段。但是,根據我的經驗,最好避免依賴對數據的假設(例如出價不斷增加),因爲事情在現實生活中會變得越來越糟糕。
謝謝,這是我在堆棧溢出時遇到的最佳答案!只是一個小問題 - 在哪裏?物品從哪裏來?我已閱讀並且無法看到它們的定義:s – 2012-07-27 14:49:25
這是一個表別名。我做了'INNER JOIN(等等等等)。 – 2012-07-27 16:20:30