2012-03-29 21 views
1

我正在嘗試爲遊戲創建排行榜。遊戲由標有自己ID的不同遊戲組成。 MySQL db中的'參與'表看起來像這樣:計算其他人的專欄並在表格中填寫結果

| participation_id | user_id | score1 | score2 | score3 | total | 
| 1    | 23  | 78  | 12  | 98  |  | 
| 2    | 31  | 68  | 45  | 95  |  | 
| 3    | 23  | 98  | 23  | 100 |  | 

所有得分從0到100只是供您參考。 我想爲每個參與者填寫score1+score2+score3的總列,如果由同一用戶運行的另一參與者的總分數較好,則將其填入NULL0。 我是那種時候纔來MySQL的腳本初學者,所以我在問你,尤其是對腳本的第二部分:/

注意有關總比分:我沒有計算出總的插入行時得分爲分數值需要規範化從0轉到100

編輯:作爲寫入DB將創建冗餘和在我的情況是不需要的,我更新我的問題:如何做我過濾這些結果只保留每個用戶的最佳分數?

| user_id | total | 
| 1  | 98 | 
| 2  | 45 | 
| 1  | 12 | 
| 2  | 69 | 
| 1  | 54 | 

EDIT2:最簡單的解決方案是使用GROUP BY這樣的:

SELECT user_id, MAX(total) AS score 
FROM table_name 
GROUP BY score 

感謝您的建議!

+1

我建議對有條件填充根據用戶的其他合計總列。實際上,我會建議不要一起添加總列......您可以在查詢內部進行總計和條件選擇,而不是在表格本身內進行。 – 2012-03-29 21:08:55

回答

3

當你可以做這樣的事情時,爲什麼還要打擾總體呢?

SELECT 
    user_id, 
    MAX(score_1 + score_2 + score_3) 
FROM 
    scores 
GROUP BY 
    user_id 

這會給你每個用戶最好的總分。如果你想要做更復雜的事情,那就問問題,但是添加總列違反了正常形式(所以有score_1,score_2,score_3 btw)。

更好的設計可能是:

participation_id user_id score_id score 
1     23  1   78 
1     23  2   12 
1     23  3   98 
2     31  1   68 
... 
+0

+1好答案...正是我在想... – 2012-03-29 21:36:10

+0

我知道我可以通過查詢計算總數。爲什麼我想將值存儲在一列或另一個表中(重要的是該值存儲在某處,而不是存儲在DB RAM中)是因爲參與表將包含數千行,而且我無法承受每次用戶按F5並創建複雜查詢時重新計算總值。相反,我只想每5-10分鐘強制一次計算。在計算之間,php文件將僅檢索總計的「過期」值。不知道我的解釋是否清晰lol – caccialdo 2012-03-29 21:47:52

+0

我覺得你的擔心有些沒有根據。計算MAX()的額外開銷與您提出的預填充字段總數的解決方案相比可以忽略不計。無論哪種方式,你將不得不在數千名中找到特定的行。添加3列增加了很少的開銷。如果您正確編制索引,這不應該是一個大問題。正常形式應該是你的目標,只有在絕對必要時才能正常化。在這種情況下,這是沒有必要的。 – 2012-03-29 21:57:29

相關問題