2012-07-12 61 views
2

我有一個測驗結果表。用戶可以反覆重複每個類別 - 我需要每個類別的最高分數和相應的時間戳。MySQL/PHP:返回包含MAX值的行值

所以我非常接近,但時間戳字段正在殺死我。如果我可以爲每個類別取第一行,那麼這個數據就會被分類, ... M完成)

catid score timestamp 
5 100% 2012-03-22 19:26:41 
6 88.89% 2012-06-12 15:20:41 
6 77.78% 2012-06-12 15:17:58 
7 100% 2012-06-12 16:08:35 
7 100% 2012-06-12 16:03:35 
7 53.33% 2012-06-12 15:59:44 
8 88.89% 2012-06-12 16:13:00 
9 83.33% 2012-06-12 16:22:19 
10 100% 2012-06-12 17:55:50 
10 76.47% 2012-06-12 17:51:54 
11 100% 2012-06-12 18:07:12 
11 66.67% 2012-06-12 18:05:35 

這就是我需要:

catid score   timestamp 
5 100% 2012-03-22 19:26:41 
6 88.89% 2012-06-12 15:20:41 
7 100% 2012-06-12 16:08:35 
8 88.89% 2012-06-12 16:13:00 
9 83.33% 2012-06-12 16:22:19 
10 100% 2012-06-12 17:55:50 
11 100% 2012-06-12 18:07:12 

這裏的MySQL的我使用的是:

SELECT catid 
, MAX(0 + score) 
, `timestamp` 

FROM `results` 
WHERE userid = 100 
GROUP BY catid 
ORDER BY catid ASC 
, (0 + score) DESC 
, timestamp DESC 
; 

而且它產生的表:

5 100 2012-03-22 19:26:41 
6 88.89 2012-06-12 15:17:58 
7 100 2012-06-12 15:59:44 
8 88.89 2012-06-12 16:13:00 
9 83.33 2012-06-12 16:22:19 
10 100 2012-06-12 17:51:54 
11 100 2012-06-12 18:05:35 

這麼近 - 但時間戳不與最高值相關聯的一個。怎麼回事,我該如何解決?

謝謝!

+0

感謝您的鏈接 - 我實際上在發佈前最近幾個小時閱讀了大約30-40個主題。看看我是否可以深入瞭解該鏈接,更多的鏈接內的鏈接有一點更有用,雖然評論指出不理想。 – Gisto 2012-07-12 23:25:11

+0

除非系統徹底廢除,否則他們不能。我只想要一個值。理想情況下給我最大(0 +分數),然後給我最近的時間戳。 [是,最近] – Gisto 2012-07-12 23:30:04

+0

您尚未指定如果用戶有兩個相同(和最大)的分數但具有不同的時間戳會發生什麼情況。你想在這種情況下最近? (對不起,我之前的評論是錯誤的 - 我刪除了它,這個評論就是我的意思) – 2012-07-12 23:34:19

回答

0
SELECT MAX(score), catid, timestamp FROM db.table GROUP BY catid ORDER BY score DESC; 
+0

您還需要將時間戳添加到組中 – Lock 2012-07-12 23:09:40

+0

謝謝!不幸的是,這給了我與上面相同的不正確的表格(其中時間戳與實際的MAX值沒有關聯)。當我將時間戳添加到組時,它爲每個catid返回了多個值(類似於上面發佈的第一張表)。 – Gisto 2012-07-12 23:29:30

+0

我編輯了我的查詢。也許現在是好的 – Tucker 2012-07-12 23:53:43

2

如果您使用數字類型來存儲百分比而不是字符串,那麼您的表格可能會超過328倍。然而,對於這個答案,我會忽略這個問題,儘管你應該儘快修復它。

可以按如下方式解決問題:

SELECT catid, score, MAX(timestamp) AS timestamp 
FROM results 
WHERE userid = 100 
AND (catid, CAST(score AS DECIMAL(5,2))) IN 
(
    SELECT catid, MAX(CAST(score AS DECIMAL(5,2))) AS score 
    FROM results 
    WHERE userid = 100 
    GROUP BY catid 
) 
GROUP BY catid 

看到它聯機工作:sqlfiddle

或用格式化爲字符串的日期時間:sqlfiddle

結果

 
CATID SCORE TIMESTAMP 
5  100% 2012-03-22 19:26:41 
6  88.89% 2012-06-12 15:20:41 
7  100% 2012-06-12 16:08:35 
8  88.89% 2012-06-12 16:13:00 
9  83.33% 2012-06-12 16:22:19 
10  100% 2012-06-12 17:55:50 
11  100% 2012-06-12 18:07:12 
+0

太棒了!@numeric type:是的,我沒有用原始數據製作原始系統,這是我必須調整的第一件事。有一件事 - 因爲有很多用戶我需要調用一個特定的用戶標識符(上面看到我的WHERE語句)。我嘗試過這樣做,但它沒有給我正確的價值觀 - 我該怎麼做?謝謝! – Gisto 2012-07-13 00:07:14

+0

@Gisto:你把它放在兩個選擇中了嗎? – 2012-07-13 00:17:28

+0

是的,但是當我把它放在第一個選擇(或更具體地說'WHERE(catid,userid = 100,CAST(score AS DECIMAL(5,2))IN)')時,它說「操作數應該包含3列」,如果它只是在第二個,那麼它將拉入其他用戶時間戳。 – Gisto 2012-07-13 00:22:42

相關問題