请帮忙。我有以下查询
SET @v:=0;
SELECT @v:=@v+1 as rank, version.id, CAST((st.up-st.down) as SIGNED)
votes, meta.title FROM version INNER JOIN st ON version.id=st.id INNER JOIN
meta ON version.id=meta.id ORDER BY votes DESC
问题是排名是基于version.id(版本表中的主键)的顺序而不是基于投票列的增量。我只有在包含第二个内连接时才会遇到此问题。
期望的结果:
rank | id | votes | title
1 12 100 hello
2 20 50 world
3 5 20 helloworld
目前的结果:
rank | id | votes | title
1 5 20 helloworld
2 12 100 hello
3 20 50 world
由于
答案 0 :(得分:2)
基于用户变量的排名在ORDER BY
之前被绑定。这意味着rank
值在形式上是不可预测的,并且在此查询中恰好是id
。
所以你需要使用子查询。在应用rank
值之前强制排序正确。
SELECT @v:=@v+1 as rank, t.*
FROM (
SELECT version.id,
CAST((st.up-st.down) as SIGNED) votes,
meta.title
FROM version
JOIN st ON version.id=st.id
JOIN meta ON version.id=meta.id
ORDER BY votes DESC
) t