我有两个版本的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
答案 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
`