сложный рейтинг mysql!

У меня есть таблица с такими столбцами: win, los, id...

Я хочу упорядочить таблицу по этому индексу: выигрыш / (выигрыш + проигрыш) * 30 + выигрыш / СУММ(выигрыш) * 70, а затем найти ранг для двух идентификаторов. Я не очень хорошо разбираюсь в 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 секунд для каждого пользователя, поэтому я пытаюсь найти что-то очень, очень быстро. При необходимости я мог добавить, изменить, удалить любую колонку, чтобы было максимально быстро.


person silversky    schedule 21.04.2010    source источник


Ответы (2)


Попробуй это:

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

Композитный индекс на ("выигрыш", "проигрыш") может быть полезен.

person newtover    schedule 21.04.2010

Любое выражение, которое вы используете в операторе SELECT, также может войти в ваше выражение ORDER BY.

Вы также можете присвоить выражению псевдоним столбца и упорядочить по псевдониму, как вы это сделали.

Если вам не нравится mysql, я предлагаю вам разработать свой запрос самостоятельно, а не пытаться одновременно встроить его в подготовленный оператор.

person dkretz    schedule 21.04.2010
comment
Я новичок в веб-разработке, поэтому на самом деле мне удобнее использовать подготовленные заявления. Я уже пробовал ваше первое предложение, но ни в том, ни в другом случае я не мог заставить его работать - person silversky; 21.04.2010
comment
@silversky: Он имеет в виду, что вы должны играть с ним в командной строке MySQL, пока вам не станет удобно, что он делает то, что вы хотите. Затем вы должны скопировать его в свой код. - person Ken Bloom; 21.04.2010
comment
@silversky: и если вам не очень нравится командная строка mysql (она работает, но мне все равно не нравится... :-), то используйте один из инструментов запросов MySQL: stackoverflow.com/questions/9185 / даст вам много советов! - person lexu; 21.04.2010
comment
Спасибо, это был очень хороший совет. Теперь я использую Navicat, и это здорово. - person silversky; 10.11.2010