Sequelize:加入两次同桌

Ant*_*nin 7 sql postgresql node.js sequelize.js

背景:

我有一张Users与一对多关系的桌子Userlang.例如:

 userlang.id userlang.userid userlang.lang     
+-----------+---------------+-------------+
 1            1              EN
 2            1              FR
 3            1              IT
 4            2              EN
 5            2              DE
 6            3              IT
Run Code Online (Sandbox Code Playgroud)

我想选择所有的用户和他们的userlangs至少一个userlang.lang=EN.

所以,我不能使用以下查询:

Select USERS.id from USERS inner join USERLANG on USERS.ID=USERLANG.USERID where USERLANG.LANG="EN"
Run Code Online (Sandbox Code Playgroud)

因为它只选择Userlangs带有a 的行lang="EN",而我想选择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"
)
Run Code Online (Sandbox Code Playgroud)

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

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

Select * 
from USERS innerjoin USERLANG as FILTER on FILTER.userid=USERS.userid
inner join USERLANG on USERLANG.userid=FILTER.userid
where FILTER.lang="EN"
Run Code Online (Sandbox Code Playgroud)

问题:将它们移植到sequelize上

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

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

models.User.findAll({
    include:[models.Userlang,{model:models.Userlang,as:'FILTER'}] 
})
Run Code Online (Sandbox Code Playgroud)

kos*_*tas 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
Run Code Online (Sandbox Code Playgroud)

不确定您的问题是什么,但也可以通过分两步获得相同的结果;将子查询替换为 temptable。