用于排名的mysql变量

时间:2017-09-28 19:18:29

标签: mysql sql sql-order-by ranking

请帮忙。我有以下查询

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

由于

1 个答案:

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