假设我有一个名为Table1的表。一个业务表有3个业务ID。
Table1
---------
idBusiness1, idBusiness2, idBusiness3, etc.
Business
---------
idBusiness, Name
是否可以通过关联上面的两个表来创建Sequelize查询(原始查询除外)以拉回所有3家企业的名称?
SQL看起来像这样:
SELECT
t1.id, B1.Name AS 'Business1', B2.Name AS 'Business2'
FROM
Table1 t1
LEFT OUTER JOIN
Business b1 ON idBusiness1 = b1.idBusiness
LEFT OUTER JOIN
Business b2 ON idBusiness2 = b2.idBusiness
;
答案 0 :(得分:2)
如果您的意思是表1包含具有idBusiness1,idBusiness2,idBusiness3,...值的idBusiness字段,那么您想要以SQL格式实现的是
db.seq.query('
SELECT * FROM Business
INNER JOIN Table1 ON Table1.idBusiness = Business.idBusiness ').success(function(rows) {
res.json(rows);
});
使用ORM格式,可以通过include
参数使用紧急加载:
Table1.findAll({
include: [{
model: Business,
required: true
}]
}).then(results => {
/* ... */
}.);
如果您的意思是您有3个不同的字段,并且想要获得ID的业务名称至少等于其中之一:
SELECT * from Business
INNER JOIN Table1 ON Business.idBusiness IN (Table1.idBusiness1, Table1.idBusiness2, Table1.idBusiness3)
在ORM格式中,我能想到的最简单的方法是
Business.findAll({
where: { id: list }
}
从findAll查询中的Table1获取所有ID的位置,然后将结果转换为所有ID的数组。我猜Table1.findAll {}的结果应为
格式 [{idBusiness1: 1, idBusiness2: 2, idBusiness3: 3}, {idBusiness1: 42, idBusiness2: 32, idBusiness: 70}]
因此,您只需编写一些代码就可以遍历该列表以形成另一个
finalList = [];
list.forEach((item) => {
finalList.push(item.idBusiness1)
finalList.push(item.idBusiness2)
finalList.push(item.idBusiness3)
}
如果表1中的字段超过3个,则可以遍历Javascript对象的属性以归纳这3个推入。让我知道是否是这种情况,您需要帮助。
更新:
自从OP明确以来,在查询中设置required:false
会将内部联接变为左侧(外部)联接。
添加where选项时,它将自动将required设置为true,这会将联接变为内部联接。请参见http://docs.sequelizejs.com/class/lib/model.js~Model.html#findalloptions-promisearrayinstance中对参数options.include[].where
的描述。
在Sequelize语法中似乎无法在同一表上进行联接,您将包括与要在其上调用find的表相同的表。这就是为什么Sequelize在这些特定情况下支持原始查询的原因...