续集:连接两次相同的表
背景:
我有一个与Userlang
具有一对多关系的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
我想select至less有一个userlang.lang=EN.
所有用户和他们的userlang userlang.lang=EN.
所以,我不能使用以下查询:
Select USERS.id from USERS inner join USERLANG on USERS.ID=USERLANG.USERID where USERLANG.LANG="EN"
因为它只会selectlang="EN"
的Userlangs
行,而我想select每个用户的所有userlang
行,其中至less有一个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" )
虽然内部查询将只selectlang="EN"
userlang行,但外部userlangs
将为这些用户select所有的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:我想避免写纯SQL,因为它会打开可能的注射攻击。
这是我失败的尝试,给错误,因为没有filter与用户的关系:
models.User.findAll({ include:[models.Userlang,{model:models.Userlang,as:'FILTER'}] })
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 ta left join ( select userid,lang from t where lang ="en") b on a.userid=b.userid where b.lang is not null
不知道你的问题是什么,但也可以通过两步来得到相同的结果; 用一个可变的replace子查询。
尝试用一些别名来定义你的关联:
List.belongsTo(Task, { as: 'dailyTask', foreignKey: 'dailyTask' }); List.belongsTo(Task, { as: 'weeklyTask', foreignKey: 'weeklyTask' });
创build者的例子是在这个链接: https : //github.com/sequelize/sequelize/issues/3678