我在Express应用中使用Sequelize。我需要生成一个在WHERE
子句中有子查询的查询。
SELECT *
FROM MyTable
WHERE id NOT IN (
SELECT fkey
FROM MyOtherTable
WHERE field1 = 1
AND field2 = 2
AND field3 = 3
)
我首先通过我的模型尝试过关系/关联,但无法让它发挥作用。类似的东西:
MyTable.find( {
where: {
id: {
$notIn: // <= what goes here? Can I somehow reference my include model?
}
},
include: [ {
model: MyOtherTable,
where: {
field1: 1,
field2: 2,
field3: 3
} ]
} );
然后我尝试使用Sequelize.where()
,没有运气。
然后我尝试了Sequelize.literal()
,但是不能确定它是否是“正确的”在Sequelize的where子句中进行子查询的方式,因为我是新手。< / p>
MyTable.find( {
where: {
id: {
$notIn: sequelize.literal(
'( SELECT fkey ' +
'FROM MyOtherTable ' +
'WHERE field1 = ' + field1 +
' AND field2 = ' + field2 +
' AND field3 = ' + field3 +
')'
}
}
} );
我也知道我可以使用Sequelize.query()
但是我不知道我是否应该接触它,或者literal()
是否正确,因为我觉得我有一些东西可以忽略。< / p>
我真的想知道如何使用Sequelize “正确的”方式在WHERE
子句中执行子查询。
感谢您的反馈!
答案 0 :(得分:16)
我在项目中遇到过类似的问题。 我选择实现它的方式有点不同有两个原因:
这是我的代码段,希望它有所帮助。
const tempSQL = sequelize.dialect.QueryGenerator.selectQuery('MyOtherTable',{
attributes: ['fkey'],
where: {
field1: 1,
field2: 2,
field3: 3
}})
.slice(0,-1); // to remove the ';' from the end of the SQL
MyTable.find( {
where: {
id: {
$notIn: sequelize.literal('(' + tempSQL + ')'),
}
}
} );
有些人可能会选择不使用tempSQL变量,只是在find结构中构建SQL(可能使用帮助器方法?)
我也认为这可能是sequelize的子查询扩展的基础,因为它几乎使用相同的语法。