gpt4 book ai didi

javascript - Knex.js 中的查询包装

转载 作者:行者123 更新时间:2023-12-01 03:11:03 25 4
gpt4 key购买 nike

我们如何将查询包装到联合组中?

我有这个查询:

    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)

关于javascript - Knex.js 中的查询包装,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45852139/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com