首页 文章

Sequelize:加入两次同桌

提问于
浏览
6

背景:

我有一个表 UsersUserlang 有一对多的关系 . 例如:

userlang.id userlang.userid userlang.lang     
+-----------+---------------+-------------+
 1            1              EN
 2            1              FR
 3            1              IT
 4            2              EN
 5            2              DE
 6            3              IT

我想选择 all users and their userlangsat least 一个 userlang.lang=EN.

所以,我 cannot 使用以下查询:

Select USERS.id from USERS inner join USERLANG on USERS.ID=USERLANG.USERID where USERLANG.LANG="EN"

因为它只选择带有 lang="EN"Userlangs 行,而我想选择每个用户的所有 userlang 行,其中至少有一行 lang="EN"

我已经能够用SQL以两种方式编写这样的查询:

使用子查询:

Select * 
from USERS inner join USERLANG on USERS.ID=USERLANG.USERID
where USERS.ID in (
    Select USERS.id 
    from USERS inner join USERLANG on USERS.ID=USERLANG.USERID
    where USERLANG.LANG="EN"
)

虽然内部查询将仅选择带有 lang="EN" 的userlang行,但外部查询将为这些用户选择所有 userlangs .

使用同一个表的两个内部联接:

Select * 
from USERS innerjoin USERLANG as FILTER on FILTER.userid=USERS.userid
inner join USERLANG on USERLANG.userid=FILTER.userid
where FILTER.lang="EN"

问题:将它们移植到sequelize上

我完全无法在sequelize上编写子查询:我想避免编写纯SQL,因为它可能会打开可能的注入攻击 .

这是我失败的尝试,因为'FILTER'与USer没有关系而产生错误:

models.User.findAll({
    include:[models.Userlang,{model:models.Userlang,as:'FILTER'}] 
})

2 回答

  • 1
    select userid,lang 
           from t 
           where userid in ( 
                              select userid 
                              from t  where lang="en" 
                              group by userid having count(lang)>=1)
    
        select a.userid,a.lang 
        from t a left join ( select userid,lang from t where lang ="en") b  
        on a.userid=b.userid 
        where b.lang is not null
    

    不确定你的问题是什么,但也可以分两步完成相同的结果;用temptable替换子查询 .

  • 1

    尝试使用某些别名定义您的关联:

    List.belongsTo(Task, {
                  as: 'dailyTask',
                  foreignKey: 'dailyTask'
                });
    
                List.belongsTo(Task, {
                   as: 'weeklyTask',
                   foreignKey: 'weeklyTask'
                });
    

    创建者的示例位于以下链接中:https://github.com/sequelize/sequelize/issues/3678

相关问题