MySQL 用户定义变量和动态列上的 ORDER BY

标签 mysql sql

此查询:

SET @position := 0;
SELECT 
    (@position:=@position + 1),
    (statistics.value - statistics_logs.value) AS value_new
FROM
    rankings AS r
        LEFT JOIN
    rankings_logs AS rl ON statistics_logs.name = statistics.name
        AND statistics_logs.user_id = statistics.user_id
ORDER BY value_new DESC

...没有给出预期的结果:

"(@position := @position + 1)"  value_new
1   10
2   20
3   30
4   40
5   50

相反,它返回奇怪的结果:

"(@position := @position + 1)"  value_new
4   10
2   20
3   30
1   40
5   50

我认为这是因为 value_new 是根据不同表中两个值的提取生成的,并且 ORDER BY 在定义 position 之后以某种方式发生。但我不知道如何解决这个问题。有什么想法吗?

最佳答案

我认为使用子查询会起作用:

SELECT (@position:=@position + 1), value_new
FROM (SELECT (statistics.value - statistics_logs.value) AS value_new
      FROM rankings r LEFT JOIN
           rankings_logs rl
           ON rl.name = r.name AND sl.user_id = s.user_id
      ORDER BY value_new DESC
     ) cross join
     (select @position := 0) vars;

关于MySQL 用户定义变量和动态列上的 ORDER BY,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25234813/

相关文章:

mysql - 分组依据 - 覆盖结果中每个组下决定行的默认行为

php不显示最低值

sql - Postgres 为组创建 id

php - SQL 查询 INNER JOIN - 意外结果

mysql - 将数据库中的扩展名前的文件名加 1

php - 如何导入用 php 导出为文本的多个 mysql 查询?

MySQL 无法添加或更新子行 - 外键约束失败

mysql - 我可以使用驼峰式别名来命名 SQL 的结果列吗?

c# - 更新数千条记录的最有效方法是什么

sql - PostgreSQL - 组合函数的 SELECT 和 RETURN VALUE