我有一张表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"
因为它只选择带有Userlangs
的{{1}}行,而我想选择每个用户的所有lang="EN"
行,其中至少有一行userlang
< / p>
我已经能够用SQL以两种方式编写这样的查询:
lang="EN"
虽然内部查询将仅选择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"
)
的userlang行,但外部查询将为此类用户选择所有lang="EN"
。
userlangs
我完全无法在sequelize上编写子查询:我想避免编写纯SQL,因为它可能会打开可能的注入攻击。
这是我失败的尝试,由于没有“过滤器”的关系而给出了错误。与USer:
Select *
from USERS innerjoin USERLANG as FILTER on FILTER.userid=USERS.userid
inner join USERLANG on USERLANG.userid=FILTER.userid
where FILTER.lang="EN"
答案 0 :(得分:1)
string.Concat()
不确定您的问题是什么,但也可以分两步完成相同的结果;用temptable替换子查询。
答案 1 :(得分:1)
尝试使用某些别名定义您的关联:
List.belongsTo(Task, {
as: 'dailyTask',
foreignKey: 'dailyTask'
});
List.belongsTo(Task, {
as: 'weeklyTask',
foreignKey: 'weeklyTask'
});
创建者的示例在此链接中: https://github.com/sequelize/sequelize/issues/3678
答案 2 :(得分:0)
这是一篇非常古老的文章,但希望它能为某人提供一个有用的答案。有很多方法可以实现这一点,包括一些原始的续集选项。
但是,假设这是一个可重用的引用,我将尝试在[USERLANG]和[USERLANG]上建立一个关联,并基于此进行查询。这将修改模型,因此对于一次性查询可能会有些许麻烦。
models.UserLang.hasMany(models.UserLang, {as: 'Filter', foreignKey: 'UserId', targetKey: 'UserId'});
models.User.findAll({
include:[{ model: models.Userlang,
required: true,
include:[{ model: models.Userlang,
required: true, // redundant
as: 'Filter',
where: { lang='EN' }
}]
}]
})
您还可以在attributes
列表中放置原始SQL子查询,并使用where
子句根据结果进行过滤。那将是一种一次性解决方案,不需要修改模型。但这确实可以追溯到您对原始SQL的厌恶。