续集:连接两次相同的表

背景:

我有一个与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'}] }) 

Solutions Collecting From Web of "续集:连接两次相同的表"

  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