私は本質的に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:
Knexのバージョン0.6では、サブクエリをほぼどこでも使用できるようになりました。これをchrome console at 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
s ...)。