[英]How do I select unique, most recently inserted, values from a mysql table?
[英]In mysql: how can I select the most recently added row when selecting by MAX if two values are equal (application is a games high score table)
我正在嘗試從具有布局的表中的條目構建一個高分表
id(int) | username(varchar) | score(int) | modified (timestamp)
使用以下方法為每個用戶選擇每天的最高分數效果很好:
SELECT id, username, MAX( score ) AS hiscore
FROM entries WHERE DATE( modified ) = CURDATE( )
我被卡住的地方是,在某些情況下,比賽可能會在同一天多次獲得相同的分數,在這種情況下,我需要確保它始終是最早被選中的,因為 2 個分數匹配將是第一個達到那個分數誰贏了。
如果我的表包含以下內容:
id | username | score | modified
________|___________________|____________|_____________________
1 | userA | 22 | 2014-01-22 08:00:14
2 | userB | 22 | 2014-01-22 12:26:06
3 | userA | 22 | 2014-01-22 16:13:22
4 | userB | 15 | 2014-01-22 18:49:01
在這種情況下返回的獲勝表應該是:
id | username | score | modified
________|___________________|____________|_____________________
1 | userA | 22 | 2014-01-22 08:00:14
2 | userB | 22 | 2014-01-22 12:26:06
我試圖通過向查詢添加ORDER BY modified desc
來實現這一點,但它總是返回后面的分數。 我也試過ORDER BY modified asc
,但我得到了相同的結果
這是經典的每組最大 n 個問題,在 StackOverflow 上經常得到解答。 這是您的情況的解決方案:
SELECT e.*
FROM entries e
JOIN (
SELECT DATE(modified) AS modified_date, MAX(score) AS score
FROM entries
GROUP BY modified_date
) t ON DATE(e.modified) = t.modified_date AND e.score = t.score
WHERE DATE(e.modified) = CURDATE()
我認為這對你有用,而且是最簡單的方法:
SELECT username, MAX(score), MIN(modified)
FROM entries
GROUP BY username
這在您的情況下返回:
"userB";22;"2014-01-22 12:26:06"
"userA";22;"2014-01-22 08:00:14"
但是,我認為您想要的(在您的示例中是錯誤的)最近的一行。 為此,您需要這樣做:
SELECT username, MAX(score), MAX(modified)
FROM entries
GROUP BY username
返回:
"userB";22;"2014-01-22 18:49:01"
"userA";22;"2014-01-22 16:13:22"
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.