Sequelize-使用AND运算符的JOIN查询表

时间:2019-12-17 23:25:46

标签: node.js sequelize.js jointable

我正在使用sequelize处理Electon应用程序使用的SQLite数据库。应用程序使用户可以根据选定的主题,心情等搜索音乐。

我正在尝试建立允许选择多种心情的搜索机制,并且该功能应返回包含所有所选心情的曲目

这里是上面提到的数据库简化模型:

enter image description here

还设置了模型之间的sequelize关系


db.moods.belongsToMany(db.tracks, {
  through: db.moodsTracks,
  foreignKey: 'uuid',
});
db.tracks.belongsToMany(db.moods, {
  through: db.moodsTracks,
  foreignKey: 'trackId',
});
db.moods.hasMany(db.moodsTracks, {foreignKey: 'uuid'});
db.tracks.hasMany(db.moodsTracks, {foreignKey: 'trackId'});

现在我要查找包含特定情绪的所有曲目

let tracks = await db.tracks.findAll({
  include: [{
    model: db.moods,
    required: true,
    where: uuid: {
      [Op.and]: ['MOOD-UUID-1', 'MOOD-UUID-2']
    }
  }],
})

(第一次尝试失败)

我试图记录由sequelize代码生成的日志及其返回值:

INNER JOIN `moodsTracks` AS `moodsTracks` ON `tracks`.`id` = `moodsTracks`.`trackId` 
AND (
  `moodsTracks`.`uuid` = 'MOOD-UUID-1' 
  AND `moodsTracks`.`uuid` = 'MOOD-UUID-2'
)

然后我尝试构建原始SQLite查询

SELECT 
  COUNT(trackid), 
  * 
FROM 
  `tracks` AS `tracks` 
  INNER JOIN `moodstracks` AS `moodsTracks` ON `tracks`.`id` = `moodstracks`.`trackid` 
WHERE 
  (
    `moodsTracks`.`uuid` = 'MOOD-UUID-1' 
    OR `moodsTracks`.`uuid` = 'MOOD-UUID-2'
  ) 
GROUP BY 
  (`moodsTracks`.`trackId`) 
HAVING 
  COUNT(trackid) = 2;

我知道这不是很好的解决方案,但是它可以在SQL控制台中使用。

问题: 还有其他解决此类问题的方法吗?也许我错误地使用了AND运算符

如果没有,我将尝试实现上面的SQL代码。 在sequelize中是否有任何有关HAVING关键字的文档,我在官方网页上未找到类似的内容

2 个答案:

答案 0 :(得分:0)

在原始查询中使用“或”时,为什么要使用[操作和]?

答案 1 :(得分:0)

此解决方案对我有用:

let tracks = await db.tracks.findAll({
  include: [db.moods],
  group: 'moodsTracks.trackId',
  include: [{
    model: db.moods,
    where: {
      uuid:['UUID1', 'UUID2']
    },
    having: ["COUNT(DISTINCT moodsTracks.uuid) = 2"]
  }]
})