【发布时间】:2016-04-05 10:09:42
【问题描述】:
背景:
我有一个表 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
我想选择所有用户及其用户语言至少有一个userlang.lang=EN.
所以,我不能使用以下查询:
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" 的用户语言行,但外部查询将为此类用户选择所有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,因为它会打开可能的注入攻击。
这是我失败的尝试,由于“过滤器”与用户没有关系而导致错误:
models.User.findAll({
include:[models.Userlang,{model:models.Userlang,as:'FILTER'}]
})
【问题讨论】:
-
您提到子查询不适用于 Sequelize,但是您的联接查询呢?
-
@TimBiegeleisen,在问题的最后,我尝试加入查询。 Sequelize 会报错,因为
FILTER与 ORM 模型中的Users没有关联。看来我无法进行任意连接。
标签: sql node.js postgresql sequelize.js