簡體   English   中英

在Knex.js中使用MYSQL SET @

[英]Using MYSQL SET @ in 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM