在 Knex.js 中使用 MYSQL SET @

Using MYSQL SET @ in Knex.js

我一直在浏览文档和在线,但找不到示例或任何相关信息。

您可以将 SET 与 Knex.js 一起使用吗?如果是这样,怎么办?我想创建排名 table,这是教程中的示例查询。但是我无法让 SET 工作。

SET @rank=0;

SELECT @rank:=@rank+1 AS rank, fruit, amount
  FROM sales
 ORDER BY amount DESC

Barmar 的回复让我走上了使用 Knex.js 排名的正确道路。这是我对那些正在寻找的人的最后 Knex.js 声明。我能够创建 table 并列出它。

let schoolId = req.params.id;

knex.select(knex.raw('@rank:=@rank+1 AS rank'),'schools.SID',
knex.raw('ROUND(AVG(IF(reviews.active = 1,((Q1+Q2+Q3+Q4+Q5+Q6+Q7+Q8+Q9+Q10)/(10*10)*10), NULL)) ,1) AS average'))
.from('schools')
.joinRaw('CROSS JOIN (SELECT @rank := 0) AS vars')
.rightJoin('reviews', 'reviews.schoolID', 'schools.SID')
.where('schools.schoolCountry', '=', 'China')
.groupBy('schools.SID')
.orderByRaw('schools.SID DESC, schools.schoolCountryCode ASC ')
.then(function (rank) {
    console.log(rank);
    res.locals.ranking = rank;
    next();
}).catch(function (error) {
    console.log(error);
    res.send('An error occured');
});

如果 knex.js 在查询之间保持数据库连接打开,它应该可以工作。变量仅在数据库连接中持久存在,因此如果它为每个查询打开一个新连接,变量将在 SETSELECT 之间丢失。

但即使可以做到,更好的方法是在查询本身中初始化变量:

SELECT @rank := @rank + 1 AS rank, fruit, amount
FROM sales
CROSS JOIN (SELECT @rank := 0) AS vars
ORDER BY amount DESC