簡體   English   中英

Knex.js中的查詢換行

[英]Query wrap in 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排序並分頁的內容。

當與groupBy等結合使用時,unionAll在unionAll工作方式存在很大問題。

因此,我將使用knex.raw ,它對於任何類型的復雜查詢組合都非常強大。 使用knex raw的好處是,您可以對大多數部分使用常規查詢構建器,而只需將查詢的所需部分寫為原始。

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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM