2017-08-24 2 views
0

どのようにユニオン上のグループにクエリをラップするのですか?Knex.jsのクエリーラップ

私はこのクエリを持っている:

SELECT * FROM (
     (SELECT u1.* FROM `user` AS u1 WHERE user_email IS NOT NULL GROUP BY u1.key) 
     UNION ALL 
     (SELECT u2.* FROM `user` AS u2 WHERE user_email IS NULL) 
) AS u ORDER BY u.id LIMIT 10 

私はこれまで行うことができました:

knex.select('*').from('user').whereNotNull('email').groupBy('user.key') 
.unionAll(function() { 
    this.select('*').from('user as u2').whereNull('u2.email'); 
}, true) 

しかし、これはにつながる:

失敗である
SELECT user.* FROM `user` WHERE user.email IS NOT NULL 
UNION ALL 
(SELECT u2.* FROM `user` AS u2 WHERE email IS NULL) 
GROUP BY user.key 

。これを行う方法はありますか?最初のクエリのようなものが必要です。なぜなら、IDで並べ替えてページを取得する必要があるからです。

答えて

0

だから私は組み合わせて複雑なクエリのいずれかの種類のためにかなり強力ですknex.rawとなるだろうなど

GROUPBYと組み合わせたときknexでunionAll作品はかなり問題がある方法。 knexの素敵なことは、ほとんどのパーツで通常のクエリービルダーを使用し、クエリーの必要な部分をそのまま書き込むことができるということです。

https://runkit.com/embed/905uidg7qdiw

とにかくこれはそれを行うための一つの方法である:

knex.from(
    knex.raw('? UNION ALL ? AS u', [ 
    knex('user').select('*').whereNotNull('user_email').groupBy('key'), 
    knex('user').select('*').whereNull('user_email') 
    ]) 
).orderBy('u.id').limit(10) 
関連する問題