在sequelize中,如何选择匹配多行不同值的记录?

时间:2016-07-07 13:44:42

标签: javascript sql sequelize.js

举个例子,我有下表:

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)。

2 个答案:

答案 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;
  });
})