javascript - 在 Knex.js 中使用 MYSQL SET @

标签 javascript mysql knex.js

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

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

SET @rank=0;

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

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

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

关于javascript - 在 Knex.js 中使用 MYSQL SET @,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48672808/

相关文章:

javascript - 如何在选中复选框的行之后插入行

javascript - CSS nth-child 选择器不适用于 JS 创建的表

SunburstR 图的 Javascript 排序

java - 使用java比较MySql日期与系统日期

mysql - 如何使用 mysql 和 knex js (Node js) 插入存储在数组中的多个 JSON 记录?

php - Facebook API(Javascript): Posting to a friendlist

php - 如何在 2 个查询之间共享 connection_id?

php - 如何在 CodeIgniter View 中显示数据?

node.js - 如何在 Bookshelf js 中使用 groupBy?

javascript - 如何从第二个 knex 查询内的 knex 查询访问变量?