我有一个表,列有: 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秒运行一次,所以我试图非常非常快地找到一些东西。如果有必要,我可以添加、更改、删除任何列,以便尽可能快。
发布于 2010-04-21 16:41:25
试试这个:
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-21 09:40:19
无论您在SELECT语句中使用什么经验,都可以在ORDER BY表达式中使用。
您还可以为表达式指定一个列别名并按别名排序,就像您所做的那样。
如果您对mysql感到不舒服,那么我建议您自己开发查询,而不是同时尝试将其嵌入到准备好的语句中。
https://stackoverflow.com/questions/2679770
复制相似问题