我想通过sequelize ORM获得如下查询:

SELECT "A".*,      
FROM "A" 
LEFT OUTER JOIN "B" ON "A"."bId" = "B"."id"
LEFT OUTER JOIN "C" ON "A"."cId" = "C"."id"
WHERE ("B"."userId" = '100'
       OR "C"."userId" = '100')

问题是sequelise不允许我在where子句中引用"B"或"C"表.以下代码

A.findAll({
    include: [{
        model: B,
        where: {
            userId: 100
        },
        required: false

    }, {
        model: C,
        where: {
            userId: 100
        },
        required: false
    }]
] 

给我

SELECT "A".*,      
FROM "A" 
LEFT OUTER JOIN "B" ON "A"."bId" = "B"."id" AND "B"."userId" = 100
LEFT OUTER JOIN "C" ON "A"."cId" = "C"."id" AND "C"."userId" = 100

这是完全不同的查询结果

A.findAll({
    where: {
        $or: [
            {'"B"."userId"' : 100},
            {'"C"."userId"' : 100}
        ]
    },
    include: [{
        model: B,
        required: false

    }, {
        model: C,
        required: false
    }]
] 

甚至不是有效的查询:

SELECT "A".*,      
FROM "A" 
LEFT OUTER JOIN "B" ON "A"."bId" = "B"."id"
LEFT OUTER JOIN "C" ON "A"."cId" = "C"."id"
WHERE ("A"."B.userId" = '100'
       OR "A"."C.userId" = '100')

使用sequelize是否可以进行第一次查询,或者我应该只使用原始查询?

推荐答案

将引用联接表的列包装为$$

A.findAll({
    where: {
        $or: [
            {'$B.userId$' : 100},
            {'$C.userId$' : 100}
        ]
    },
    include: [{
        model: B,
        required: false

    }, {
        model: C,
        required: false
    }]
}); 

Sql相关问答推荐

即使缺少某些行,如何查找特定窗口期的平均销售额

创建每小时重置的序列号

如何更改函数返回的列名?

获取每5分钟时间间隔的总和

在Golang中管理数据库事务的简洁方法

如何根据计数和分组获取订单总数

每组显示一行(表1中的分组值),表2中的不同列表用逗号分隔

防止ActiveRecord迁移在db/structure.sql中进行巨大更改

SQL:如何取上一年的平均值?

返回找到的最小和最大row_number()spark SQL

我需要一个regexp_like来只验证字母D或T、数字和管道

在WHERE EXISTS子查询中,列返回是否重要?

使用同一个表,为什么IN、NOT IN、NOT EXISTS和EXISTS有不同的输出?

DbUp for sqlserver 在 dbo 授权下为非 dbo 用户创建架构

Postgres如何在一个日历周中前进和回填值

正则表达式忽略特定数据部分的分隔符

PostgreSQL - 从同一张表中获取值

如何防止 SQL 中的负收入值并将其重新分配到接下来的月份?

以 15 分钟为间隔的使用情况SQL 查询

在 sql 中合并系列以删除重复项