在hasmany的续集中与计数
Posted
技术标签:
【中文标题】在hasmany的续集中与计数【英文标题】:Where on hasmany in sequelize with count 【发布时间】:2017-04-25 11:14:47 【问题描述】:我不是最擅长 UML/数据库图,但以下希望展示我的数据库设计 (MsSQL)
我有一个“位置”表,其中有零到多个与其相关的托盘(一个位置有 0 到多个托盘)。但是,该位置可以是位置 x 或 y 这两种类型之一。此图对其进行了简化,但有许多不同类型的位置,每种类型的字段也非常不同。
我将 Sequelize 用作 ORM,并试图弄清楚如何执行特定查询。我想我很接近但很卡住。
我需要的是:
选择一个 LocationTypeX,其中“活动”为真,并且其对应的 Location 中的托盘少于 10 个。
以前我已经获得了所有“活动”为真的 LocationTypeX。包括位置和托盘(在位置上)并在代码中完成所有操作以确定哪个位置是相关的。然而,这将永远持续下去,因为有成千上万的位置和大量的货盘散布在其中。
我所追求的只是显示位置名称。这就对了。但是与上述条件匹配的位置名称。希望有人可以提供帮助?
目前为止
models.Location.findAll(
group: ['Location.id', 'Pallets.id'],
attributes: ['Location.id', 'Pallets.id', [models.sequelize.fn('COUNT',models.sequelize.col('Pallets.id')), 'PalletCount']],
include: [
model: models.Pallet,
attributes: []
]
).then((ret)=>
console.log(ret);
);
但这不会进行“主动”检查。并且也不对托盘数量执行 where 子句。回到第一格
【问题讨论】:
运行 Sql profiler 并检查实际查询 @MikhailLobanov 为什么?我目前的查询还很遥远 对不起,我的英语不太好。 “远方”是什么意思?运行命令models.Location.findAll(
时没有sql查询?
【参考方案1】:
我已经设法用可以在 Sequelize 中使用的原始 SQL 来回答我自己的问题。但是我仍然想知道如何在 Sequelize 中做到这一点
models.sequelize.query(
`SELECT TOP 1 Locations.id, Locations.name FROM LocationTypeX
INNER JOIN Locations ON LocationTypeX.LocationId = Locations.id
LEFT JOIN Pallets on (Locations.id = Pallets.LocationId)
WHERE LocationTypeX.active = 1
GROUP BY Locations.id, Locations.name
HAVING COUNT(Pallets.id) < 3`
, type: models.sequelize.QueryTypes.SELECT)
【讨论】:
以上是关于在hasmany的续集中与计数的主要内容,如果未能解决你的问题,请参考以下文章
sequelizejs 关系/关联,hasMany/belongsTo vs 定义模型上的参考