举个例子,我有下表:
A | B
------
1 | 2
1 | 3
1 | 4
2 | 3
2 | 4
3 | 3
我想选择B中A列中值为1 AND 2的所有值。所以在上面的例子中我应该得到结果(3,4)因为只有3和4对于A列有值1和2。
我如何在续集中这样做?
这就是我的尝试:
db.myModel.findAll({
where: {
A: whatImSearching
},
attributes: ['A', 'B']
})
whatImSearching = [1,2]
但是该解决方案返回只有一个值匹配的结果,即我得到的结果(2,3,4)。但我应该得到(3,4)。
答案 0 :(得分:1)
注意:这是如何在SQL中完成的,就像评论中提到的@daf一样,类似行上的东西可以在Sequelize中实现。我将此作为参考
您可以使用具有此类条件的分组
SELECT B
FROM Table1 GROUP BY B
HAVING SUM(CASE WHEN A IN(1,2) THEN 1 ELSE 0 END) = 2
编辑
假设您有重复的值。这应该更好
SELECT B
FROM Table1 GROUP BY B
HAVING SUM(CASE WHEN A = 1 THEN 1 ELSE 0 END) = 1
AND SUM(CASE WHEN A = 2 THEN 1 ELSE 0 END) = 1
答案 1 :(得分:1)
编辑:我没有立即看到一个纯粹的Sequelize方法来做到这一点,但是下面应该可以获得你想要的地方,从数据库中带回一些额外的行。
假设您使用如下模型进行查询:
var model = sequelize.define('model', {
A: { type: Sequelize.TEXT },
B: { type: Sequelize.TEXT }
}, {
tableName: 'SomeTable',
timestamps: false
})
你可以这样做:
var search = [1,2];
model.findAll({
where: { A: { '$in': search } },
attributes: ['A', 'B']
}).then(function(instances) {
var unwrapped = instances.map(function(i) {
return i.get();
});
var withCounts = unwrapped.reduce(function(acc, cur) {
var thisB = cur.B;
var accItem = acc.filter(function(i) {
return i.B === thisB;
})[0];
if (!accItem) {
accItem = { B: thisB, count: 0 };
acc.push(accItem);
}
accItem.count++;
}, [])
var hasAll = withCounts.filter(function(i) {
return i.count === search.length;
}).map(function(i) {
return i.B;
});
})