2010-04-21 100 views
0

我有一個表,這些列:贏,洛杉磯,編號...複雜的mysql排名!

我想按此索引排序表:win /(win + los)* 30 + win/SUM(win)* 70 ,然後找到兩個id的排名。 我對mysql不太擅長,所以我寫的是完全錯誤的。 (它使用Perl DBI + + DBD :: MySQL的):

$stmt=$con->prepare("SET @rk := 0"); 
$stmt=$con->prepare("SELECT rank, id FROM (
          SELECT @rk := @rk + 1 AS rank,     
           (win/(win+los)*30+win/SUM(win)*70) AS index, 
           win, los, id 
          FROM tb_name ORDER BY index DESC) as result 
        WHERE id=? AND id=?"); 
$stmt -> bind_param ("ii", $id1, $id2); 
$stmt -> execute(); 
$stmt -> bind_result($rk, $idRk); 

而且也該查詢它想也許運行每5-10秒,爲每一位用戶,所以我試圖找到一些非常,非常快。 如果有必要,我可以添加,更改,刪除任何列,以儘可能快。

回答

1

試試這個:

SELECT rank, id FROM (
    SELECT @rk := @rk + 1 AS rank,     
    (win/(win+los)*30+win/win_sum*70) AS index, -- SUM(win) -> win_sum 
    win, los, id 
    FROM tb_name, 
    (SELECT SUM(win) as win_sum FROM tb_name) as ws -- separated SUM(win) 
    ORDER BY index DESC) as result 
WHERE id IN (?, ?); -- id=? AND id=? will never happen, should be OR 

上的複合指數( '雙贏', '洛杉磯')可能是有用的。

0

無論您在SELECT語句中使用的任何展開方式都可以進入您的ORDER BY表達式。

您也可以像以前那樣通過別名爲表達式分配別名和順序。

如果你對mysql不太熟悉,那麼我建議你自己開發你的查詢,而不是試圖將它同時嵌入到一個準備好的語句中。

+0

我是webdevelopment中的新成員,所以實際上我更喜歡準備好的語句。我已經嘗試了你的第一個建議,但是既不能讓它工作 – silversky 2010-04-21 01:54:35

+1

@silversky:他的意思是你應該在MySQL的命令提示符下使用它,直到你確定它滿足你的要求。那麼你應該把它複製到你的代碼中。 – 2010-04-21 02:07:12

+0

@silversky:如果你不太喜歡mysql命令提示符(它可以工作,但我仍然不喜歡它...... :-),那麼使用其中一個MySQL查詢工具:http:// stackoverflow .com/questions/9185/what-the-the-best-mysql-client-application-for-windows會給你很多提示! – lexu 2010-04-21 05:48:42