在Knex.js中使用MySQL SET @实现排名表的技术问询
在Knex.js中使用SET语法实现排名表
我之前尝试创建排名表时,也碰到了和你一模一样的问题——翻遍了Knex.js的官方文档,也查了不少网络资料,愣是没找到相关的示例说明,不知道怎么把教程里带SET语法的排名查询转换成Knex的写法。
后来多亏了Barmar的指引,我终于找对了方向,现在已经成功实现了排名表的创建和数据生成!下面是我最终用的Knex.js语句,供有需要的朋友参考:
// 基于SET变量实现基础排名的Knex查询示例 knex('scores') .select('user_id', 'total_score') // 通过raw语法引入SET变量计算排名 .select(knex.raw('@current_rank := @current_rank + 1 AS rank')) // 初始化排名变量 .crossJoin(knex.raw('(SELECT @current_rank := 0) AS rank_initializer')) // 按分数倒序排序,生成正确排名顺序 .orderBy('total_score', 'desc')
如果需要支持相同分数并列排名的复杂逻辑,也可以调整raw里的SET判断逻辑,比如:
knex('scores') .select('user_id', 'total_score') .select(knex.raw(` CASE WHEN @prev_score = total_score THEN @current_rank ELSE @current_rank := @current_rank + 1 END AS rank, @prev_score := total_score `)) .crossJoin(knex.raw('(SELECT @current_rank := 0, @prev_score := NULL) AS rank_init')) .orderBy('total_score', 'desc')
这些写法都已经验证可以正常工作,能生成符合预期的排名表列表。
内容的提问来源于stack exchange,提问作者Mike Nelson
相关产品推荐
相关产品推荐

