1选择语句2个不同的结果

时间:2017-09-29 14:00:31

标签: mysql

我有两个版本的sql设置 - 一个在远程机器上(mariadb),另一个在本地机器上(wamp)mysql。我有一个在本地版本上正确运行的查询,但是我在远程版本上收到了不同的结果。每个表的存储引擎类型在两个db中都是相同的。然而,db的存储引擎是不同的 - 一个是innodb而另一个是myisam。

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

本地版本 - 正确结果

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

3 个答案:

答案 0 :(得分:2)

表中的数据被视为无序。 FROM子句中的子查询是 a(派生)表。

因此子查询中的ORDER BY子句是多余的。 MySQL可以自由执行它。

结果没有错。您对查询执行操作的假设是错误的。

答案 1 :(得分:0)

也许你在想这个......

SELECT version.id
     , CAST(st.up-st.down as SIGNED) votes
     , meta.title
     , @v:=@v+1 rank
  FROM version 
  JOIN st 
    ON version.id = st.id 
  JOIN meta ON version.id = meta.id
  JOIN (SELECT @v:=1) vars
 ORDER 
    BY votes DESC

答案 2 :(得分:0)

您好,如果您仍想保留子查询,请尝试

`

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 
    ) t
CROSS JOIN(select @v := 0) r
ORDER BY t.votes DESC

`