背景:
我有一个表 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
我想选择 all users and their userlangs 有 at 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 回答
不确定你的问题是什么,但也可以分两步完成相同的结果;用temptable替换子查询 .
尝试使用某些别名定义您的关联:
创建者的示例位于以下链接中:https://github.com/sequelize/sequelize/issues/3678