Sub-Abfrage in Knex
Ich bin auf der Suche im wesentlichen machen diese Art der Abfrage in Knex, aber ich kann es nicht ganz verstanden, um zu arbeiten:
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
Bemerkte ich ein ähnliches Problem hier und versucht, Ihrem Rat zu Folgen, aber kann nicht scheinen zu erkennen, meine Fehler (oder ob dies überhaupt der richtige Weg, dies zu tun in den ersten Platz).
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(...)
Wenn es keine Hilfe, dass bestimmte Abfrage erzeugt die folgende Fehlermeldung:
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:
InformationsquelleAutor Salem | 2014-03-26
Du musst angemeldet sein, um einen Kommentar abzugeben.
Version 0.6 von knex ermöglicht die Verwendung von Unterabfragen so ziemlich überall jetzt. Pop diese in der chrome-Konsole an http://knexjs.org und Sie sollten sehen, es gibt Ihnen, was Sie suchen
Ich denke, dies sollte die akzeptierte Antwort. Danke @tgriesser!
Beachten Sie, dass die oben genannten funktionieren nicht ohne
.as
TeilInformationsquelleAutor tgriesser
Edit: Diese Antwort bezieht sich auf eine ältere version von knex. Sehen andere Antwort.
Wenn ich das mache, verwende ich die
knex.raw
Funktionalität. Sie können jede Art von raw-SQL. Wie diese:Könnten Sie sogar in der Lage sein, um die Abfrage erstellen mit knex, und dann verwenden Sie einfach die
.toString()
Methode zum füllenknex.raw
. Mein Beispiel war nicht Teil des API (dieIF
s...).Auch, nur zur info kannst du nun bind-Parameter im raw-Anweisungen in 0.6+, auch wenn Sie interpoliert in anderen Abfragen ist, hält es das richtige Bindungen
Ich würde empfehlen, macht @tgriesser Antwort die akzeptiert man, wie das ist, was der Realität entspricht heute.
InformationsquelleAutor clay