Я пытаюсь добавить вычисляемый/вычисленный/виртуальный столбец к запросу, выполнив следующее:
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'
Я думаю, что это может иметь что-то с тем, как я структурирую свой запрос, но, похоже, он не распознает вычисляемый столбец как тот, который можно заказать.
Ошибка вашего плохого запроса и запрос 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
.clearOrder
из запроса count с .clearOrder
метода .clearOrder
http://knexjs.org/#Builder-clearOrder
Если этот запрос подсчета создается некоторым ORM, который вы используете, тогда решение зависит от этого ORM, как избежать этой проблемы.
Вы можете использовать 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()
.