首页 > 解决方案 > 续集嵌套条件

问题描述

select * from courses where (days like '%a%' or days like '%b%') and (startTime <= 9  and 9  < endTime) OR (10 >= startTime and 10 <= endTime)

这是我想用 sequelize 写的 sql

这就是我写的

const result = await models.courses.findAll({
    where: {
      [op.or]: [
        {
          days: { [op.like]: '%a%' },
        },
        {
          days: { [op.like]: '%b%' },
        },
      ],
      [op.or]: [
        {
          [op.and]: [
            {
              startTime: { [op.lte]: 9 },
            },
            {
              endTime: { [op.gte]: 9 },
            },
          ],
        },
        {
          [op.and]: [
            {
              startTime: { [op.lte]: 10 },
            },
            {
              endTime: { [op.gte]: 10 },
            },
          ],
        },
      ],
    },
  });

但结果显示...

从课程中选择 ... WHERE (( courses. startTime<= 9 AND courses. endTime>= 9) OR ( courses. startTime<= 10 AND courses. endTime>= 10));

从一开始我的天数查询发生了什么?

标签: sequelize.js

解决方案


您缺少包含天数部分和开始时间/结束时间部分的顶级“与”。奇怪的是您没有收到错误 - 也许开始时间/结束时间部分覆盖了天数部分。


稍后添加:测试确认第二个子句将覆盖第一个子句。例如

where : {
   [Op.or] : [{id : 1},{id : 2}],  // 1st clause
   [Op.or] : [{id : 3},{id : 4}]   // 2nd clause  
}

结果只

WHERE id = 3 OR id = 4

需要有一个操作数连接两个 OR 子句....


推荐阅读