如何查询由其他查询生成的表?获取指定ID用户的serial_num
解决方法:通过ID查询用户的余额排名serial_num
你的问题出在子查询里不能直接包含SET语句,原来的写法把变量初始化和查询语句混在一起当子查询,违反了SQL语法规则。下面给你两种可行的解决方案:
方法一:在子查询中初始化用户变量(兼容低版本MySQL)
把变量初始化放到子查询的FROM子句里,确保排序时能正确生成serial_num,再在外层过滤指定ID:
SELECT serial_num, ID, Balance FROM ( SELECT (@row_num := @row_num + 1) AS serial_num, ID, Balance FROM users, (SELECT @row_num := 0) AS init_var ORDER BY Balance DESC ) AS ranked_users WHERE ID = '目标用户ID';
这里的(SELECT @row_num := 0) AS init_var会在执行子查询前完成变量初始化,保证排名从1开始计算。
方法二:使用窗口函数(MySQL 8.0+ 推荐)
如果你的MySQL版本是8.0或以上,用ROW_NUMBER()窗口函数更简洁,无需手动维护用户变量:
SELECT serial_num, ID, Balance FROM ( SELECT ROW_NUMBER() OVER (ORDER BY Balance DESC) AS serial_num, ID, Balance FROM users ) AS ranked_users WHERE ID = '目标用户ID';
窗口函数会自动按余额降序生成连续的排名序号,语法清晰易读。
内容的提问来源于stack exchange,提问作者Eliot Chignell
相关产品推荐
相关产品推荐

