2015-04-06 107 views
0

我最近做了一個系統,根據他們的積分對每個玩家進行排名。那麼系統獲得積分的方式相當混亂。在使用這個系統超過24小時後,我發現它沒有按照要點進行組織。但是後來突然想到,我可能會用一種不代表SQL查詢的方式來計算錯誤點。下面是我的排名使用我的SQL查詢:有什麼方法可以查找查詢的值嗎?

SELECT * , playeruid AS player_id, (
(
    SELECT COALESCE(sum(player1points),0) 
    FROM `mybb_matches` 
    WHERE player1uid = player_id AND gid = $id AND timestamp < $time AND winneruid is NOT NULL AND dispute != 3) 
+ 
(
    SELECT COALESCE(sum(player2points),0) 
    FROM `mybb_matches` 
    WHERE player2uid = player_id AND gid = $id AND timestamp < $time AND winneruid is NOT NULL AND dispute != 3) 
+ 
(
    SELECT SUM(rank) 
    FROM `mybb_matchesgame` 
    WHERE playeruid = player_id AND gid = $id) 
) 

AS points 
FROM mybb_matchesgame WHERE gid = $id 
ORDER BY points DESC 

現在,這顯示,我在想,如果有任何的方式來攫取的「點」的值,並以某種方式顯示出來,所以我可以確認的數​​量。這可能嗎?

+1

'不按照點組織它 - 但你有'ORDER BY points DESC' ?? '搶「點」的值 - 但你有'SELECT'?換句話說,我不明白問題是什麼。 – 2015-04-06 00:21:48

+0

我試圖確保查詢正常。我想驗證查詢爲每個用戶收集的「分數」是否正確。有沒有辦法讓我抓住這個「分數」?也許在某處迴應它? – 2015-04-06 00:25:31

+0

如果您直接在phpmyadmin或mysql命令行界面中執行單個子查詢,是否按預期工作?在子查詢中,'player_id'是主表'mybb_matchesgame'中的當前值嗎?如果是這樣,請嘗試向主表添加別名:'FROM mybb_matchesgame m WHERE gid = $ id',然後用它作爲其他值的前綴,即'WHERE player1uid = m.player_id' – 2015-04-06 00:25:35

回答

0

查詢中沒有按語句分組,因此SUM很可能不會超過預期集合。此外,COALESCE可以替換爲IFNULL,這可能會更有效一些。

SELECT q.* , playeruid AS player_id, a.points+b.points+c.points AS points 
FROM mybb_matchesgame q 
LEFT JOIN (
    SELECT IFNULL(SUM(player1points),0) as points,player_id 
    FROM `mybb_matches` 
    WHERE timestamp < $time AND winneruid is NOT NULL AND dispute != 3 
GROUP BY player_id) a ON player1uid = a.player_id 
LEFT JOIN (
    SELECT IFNULL(sum(player2points),0) as points,player_id 
    FROM `mybb_matches` 
    WHERE timestamp < $time AND winneruid is NOT NULL AND dispute != 3 
GROUP BY player_id) b ON player2uid = b.player_id 
LEFT JOIN (
    SELECT IFNULL(SUM(rank),0) as points,player_id 
    FROM `mybb_matchesgame` 
GROUP BY player_id) c ON playeruid = c.player_id 
    WHERE gid = $id 
ORDER BY a.points+b.points+c.points DESC; 
+0

我得到這個錯誤:1054 - 'field_list'中未知列'player_id'我在想什麼,是什麼讓COALESCE與IFNULL不同? – 2015-04-06 03:18:23

+0

player_id:我沒有你的數據模型,所以我的重寫是一個最佳猜測。如果添加數據模型,則可以識別未知列問題。 IFNULL是一個NULL檢查,COALESCE是返回值列表中的第一個非NULL值。 IFNULL在您的案例中更具體,您可以將IFNULL視爲COALESCE的特例 – 2015-04-06 04:33:48

相關問題