如何用Sequelize筛选非重复行?排除指定字段组合下最小number行
问题:Sequelize操作SQLite时排除字段组合中number最小的行
在Node.js环境使用Sequelize操作SQLite数据库,现有动态生成的Sequelize查询(包含各类where条件、关联查询等),需要对其改造,使其仅返回基于name、group、version、rarity字段组合的非重复行——即排除每个字段组合中number值最小的那一行。
由于该查询在十多处场景使用,存在数千种参数组合,且需支持.findAll()、.update()、.count()等Sequelize方法,因此必须保持Sequelize兼容性,禁止使用原生SQL/sequelize.query()(否则需实现类Sequelize的SQL生成器,复杂度极高)。
示例动态查询
let query = { where: { name: { [sequelize.Op.like]: '%haneul%' }, owner: "342342234243432" }, include: [{ model: marketplace, required: true, }] }
示例数据与期望结果
原始数据
| name | group | version | rarity | number |
|---|---|---|---|---|
| haneul | saturday | IKYK | 1 | 2 |
| haneul | saturday | IKYK | 1 | 3 |
| haneul | saturday | IKYK | 1 | 4 |
期望结果(排除number最小的行)
| name | group | version | rarity | number |
|---|---|---|---|---|
| haneul | saturday | IKYK | 1 | 3 |
| haneul | saturday | IKYK | 1 | 4 |
已尝试的方案
- 使用
having: COUNT(*) > 1及group: ['name', 'group', 'version', 'rarity']分组 - 在上述分组基础上,通过having筛选出最小number/id的行
- 在having中使用
sequelize.literal()编写SQL判断number大于最小值 - 建立表自关联的虚拟关联,添加include并设置
duplicating: false - 将where clause改为
[Sequelize.Op.and]组合,包含sequelize.literal()的SQL查询与原有条件
内容的提问来源于stack exchange,提问作者Discorduser200
相关产品推荐
相关产品推荐

