0

私はこれらの列を持つテーブルを持っています: win, los, id ...

このインデックスでテーブルを並べ替えたいと思います: win / ( win + los ) * 30 + win / SUM(win) * 70 そして、2 つの 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秒ごとに実行されると思われるため、非常に高速なものを見つけようとしています. 必要に応じて、できるだけ速くするために、任意の列を追加、変更、削除できます。

4

2 に答える 2

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

('win'、'los')の複合インデックスが役立つ場合があります。

于 2010-04-21T08:41:25.293 に答える
0

SELECT ステートメントで使用する式はすべて、ORDER BY 式にも使用できます。

行ったように、式に列エイリアスを割り当て、エイリアスで並べ替えることもできます。

mysql に慣れていない場合は、クエリを準備済みステートメントに同時に埋め込むのではなく、独自にクエリを作成することをお勧めします。

于 2010-04-21T01:40:19.077 に答える