Я хочу сделать такой запрос в Knex, но не могу заставить его работать:
select distinct *
from
(
select *, 1 as rank from table1 where Word like 'mike'
union
select *, 2 as rank from table1 where Word like 'mike%'
union
select *, 3 as rank from table1 where Word like '%mike%'
) as X
order by WordOrder
Я заметил аналогичную проблему здесь и попытался последовать их совету, но не могу обнаружить свою ошибку (или если это вообще правильный способ сделать это в первую очередь).
var q = DB.knex('Users').select("*", "1 as rank").where("User", "like", query).
union(function() {
this.select("*", "2 as rank").where("User", "like", query + "%")
}).
union(function() {
this.select("*", "3 as rank").where("User", "like", query + "%")
});
DB.knex("Users").distinct("*").from('(' + q.toString() + ') as X').
orderBy('rank').select().then(...)
Если это поможет, этот конкретный запрос генерирует следующую ошибку:
Error: ER_PARSE_ERROR: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '1`` order by `rank` asc' at line 1, sql: select distinct * from `select` as ``1`` order by `rank` asc, bindings:
2 ответа
Knex версии 0.6 позволяет использовать подзапросы практически где угодно. Вставьте это в консоль Chrome по адресу http://knexjs.org, и вы увидите, что он дает вам то, что вы ищете.
knex.distinct('*').from(function() {
this.union(function() {
this.select('*', '1 as rank').from('table1').where('Word', 'like', 'mike')
}).union(function() {
this.select('*', '2 as rank').from('table1').where('Word', 'like', 'mike%')
}).union(function() {
this.select('*', '3 as rank').from('table1').where('Word', 'like', '%mike%')
})
.as('X')
}).orderBy('WordOrder').toString()
Изменить: этот ответ относится к более старой версии knex. См. другой ответ.
Когда я это делаю, я использую функцию knex.raw
. Вы можете поместить туда любой необработанный SQL. Как это:
var selectRaw = "SUM( IF( "+ table.id +" = 1, "+ table.value +", 0.00 )) as customAlias";
query.column( knex.raw( selectRaw ) );
Возможно, вы даже сможете создать запрос с помощью knex, а затем просто использовать метод .toString()
для заполнения knex.raw
. Мой пример не был частью их API (эти IF
...).
Похожие вопросы
Связанные вопросы
Новые вопросы
knex.js
Knex.js - это построитель запросов для Postgres, MySQL и SQLite3, Oracle и MS SQL Server. Он разработан, чтобы быть гибким, портативным и забавным в использовании. Он имеет как традиционные функции обратного вызова в стиле узла, так и интерфейс обещаний для более чистого асинхронного управления потоком, полнофункциональные построители запросов и схем, поддержку транзакций, пул соединений и стандартизированные ответы между различными клиентами запросов и диалектами.