查询换行 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 在 knex 中的工作方式存在很大问题。

所以我会选择 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)