如何按knexjs中的计算列排序

时间:2018-05-16 02:40:14

标签: mysql knex.js

我正在尝试通过执行以下操作向查询添加计算/计算/虚拟列:

knex.select(knex.raw('DATEDIFF("2018-04-15", STR_TO_DATE(birthdate, "%d/%m/%Y")) / 365.25 as age'))
.from('user')
.orderBy('age', 'desc');

但是,我最终得到以下错误:

BadRequest: select count(`user`.`id`) as `total` from `user` order by `id` desc, `age` desc - Unknown column 'age' in 'order clause'

我认为它可能与我构建查询的方式有关,但它似乎没有将计算列识别为可以订购的列。

2 个答案:

答案 0 :(得分:0)

您可以使用orderByRaw并重复您的表达,而不仅仅是别名

knex.select(knex.raw('DATEDIFF("2018-04-15", STR_TO_DATE(birthdate, "%d/%m/%Y")) / 365.25 as age'))
.from('user')
.orderByRaw('DATEDIFF("2018-04-15", STR_TO_DATE(birthdate, "%d/%m/%Y")) / 365.25', 'desc');

我猜knex会生成另一个查询,以获取除select()部分之外的记录总数。

答案 1 :(得分:0)

您的错误请求错误和knex查询不匹配。该错误来自其他一些查询(从该knex查询构建的计数查询)。

您可以在此处查看生成的查询:https://runkit.com/embed/4au5bdj29j8j

select DATEDIFF("2018-04-15", STR_TO_DATE(birthdate, "%d/%m/%Y")) / 365.25 as age from `user` order by `age` desc

Knex不会自动生成任何计数查询。

如果您使用普通的knex,则应使用order by方法http://knexjs.org/#Builder-clearOrder

从计数查询中删除.clearOrder部分

如果该计数查询是由您正在使用的某个ORM创建的,那么解决方案取决于该ORM如何避免此问题。