0

我有一个包含这些列的表:win、los、id ...

我想通过这个索引对表格进行排序: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 秒运行一次,所以我试图非常非常快地找到一些东西。如果有必要,我可以添加、更改、删​​除任何列,以便尽可能快。

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 回答