Sequelize - 使用 AND 运算符连接查询 table
Sequelize - JOIN query table with AND operator
我正在使用 sequelize 来处理 Electon 应用程序使用的 SQLite 数据库。应用程序允许用户根据 select 编辑的主题、情绪等搜索音乐。
我正在尝试构建允许 select 多种心情的搜索机制,该功能应该 return 具有所有 selected 心情的曲目
这里是上面提到的数据库简化模型:
还设置了模型之间的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 代码及其 return 生成的日志:
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关键字的文档吗,我在官方网页上没有找到这样的东西
为什么在原始查询中使用 'OR' 而使用 [Op.and]?
这个解决方案适合我:
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"]
}]
})
我正在使用 sequelize 来处理 Electon 应用程序使用的 SQLite 数据库。应用程序允许用户根据 select 编辑的主题、情绪等搜索音乐。
我正在尝试构建允许 select 多种心情的搜索机制,该功能应该 return 具有所有 selected 心情的曲目
这里是上面提到的数据库简化模型:
还设置了模型之间的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 代码及其 return 生成的日志:
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关键字的文档吗,我在官方网页上没有找到这样的东西
为什么在原始查询中使用 'OR' 而使用 [Op.and]?
这个解决方案适合我:
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"]
}]
})