我正在使用此查询:
db.Spectrum.findAll({
attributes: ['title', [db.Sequelize.fn('SUM', db.Sequelize.col('quantity') ), 'count']],
include: [
{model: db.Varietal,
attributes : ['specID', 'id'],
include : [
{ model : db.Wine,
required: false,
attributes : ['varietal_id', 'id'],
where : {restaurant_id : restaurant_id,
owner_id : null} }
],
}
],
group : ['specID']
})
这给了我正确的结果,问题是因为它和左连接的 where 子句运行得非常慢(大约 2 秒)。
左连接的原始查询如下所示。
LEFT OUTER JOIN `wines` AS `Varietals.Wines` ON `Varietals`.`id` = `Varietals.Wines`.`varietal_id` AND `Varietals.Wines`.`restaurant_id` = 16 AND `Varietals.Wines`.`owner_id` IS NULL
我希望查询具有左连接和这样的 where 子句..
LEFT OUTER JOIN `wines` AS `Varietals.Wines` ON `Varietals`.`id` = `Varietals.Wines`.`varietal_id`
WHERE `Varietals.Wines`.`restaurant_id` = 16 AND `Varietals.Wines`.`owner_id` IS NULL
但是我尝试的所有操作都将“Spectrum”放在它前面,然后找不到该行。这应该如何完成?或者我必须只使用原始查询?
最佳答案
include.where
始终将条件添加到连接中。
然而,在 Sequelize v3.13.0
中添加了对特殊嵌套键的支持。
现在可以将 where 对象添加到包含用 $ 包裹的点分隔键的顶级对象,以指定它是嵌套字段。
将其应用到您的代码中:
db.Spectrum.findAll({
include: [
{
model: db.Varietal,
include : [
{
model : db.Wine
}
]
}
],
where: {
'$Varietals.Wines.restaurant_id$': restaurant_id,
'$Varietals.Wines.owner_id$': null
},
group : ['specID']
});
(我删除了一些语句以重点关注重要部分)
关于node.js - 使用sequelize 包含列的where 子句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33640521/