簡體   English   中英

在mysql中:如果兩個值相等,我如何在通過MAX選擇時選擇最近添加的行(應用程序是游戲高分表)

[英]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 ,但我得到了相同的結果

這是經典問題,在 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM