15

私は本質的にこの種のクエリを 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: 
4

2 に答える 2

33

knex のバージョン 0.6 では、ほとんどどこでもサブクエリを使用できます。これをhttp://knexjs.orgの chrome コンソールにポップすると、探しているものが表示されるはずです。

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()
于 2014-06-25T05:11:04.473 に答える
3

編集: この回答は、古いバージョンの knex を参照しています。他の回答を参照してください。

これを行うときは、knex.raw機能を使用します。生の SQL をそこに入れることができます。このような:

 var selectRaw = "SUM( IF( "+ table.id +" = 1, "+ table.value +", 0.00 )) as customAlias";
 query.column( knex.raw( selectRaw ) );

knex を使用してクエリを作成し、.toString()メソッドを使用して fillすることもできますknex.raw。私の例は彼らのAPIの一部ではありませんでした(それらIFの...)。

于 2014-03-31T18:39:54.257 に答える