You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 06:42:36