【问题标题】:Find rows where association count is between passed values查找关联计数在传递值之间的行
【发布时间】:2025-12-18 17:10:02
【问题描述】:

我正在尝试查找所有行及其关联模型的数量。

它应该只返回那些在两个传递的值之间有关联计数的行。

这是我尝试过的,但得到 sql 异常。

db.Employee.findAll({
    where: {
      $assignedJobCount$: {
        [Op.between]: [0, 100],
      },
    },
    include: [
      {
        model: db.AssignedJob,
        required: true,
        attributes: ['emp_id'],
      },
    ],
    attributes: [
      'id',
      'alternate_mobile',
      ['employee_unique_id', 'unique_id'],
      [Sequelize.fn('COUNT', Sequelize.col('AssignedJobs.emp_id')), 'assignedJobCount'],
    ],
    order: [['id', 'ASC']],
    subQuery: false,
    group: ['Employee.id'],
    limit: 20,
  });
  return JSON.parse(JSON.stringify(mechanics));
};

它会抛出以下错误,

sql: 
'SELECT
    `Employee`.`id`,
    `Employee`.`alternate_mobile`,
    `Employee`.`employee_unique_id` AS `unique_id`,
    COUNT(`AssignedJobs`.`emp_id`) AS `assignedJobCount`,
    `AssignedJobs`.`id` AS `AssignedJobs.id`,
    `AssignedJobs`.`emp_id` AS `AssignedJobs.emp_id`
FROM
    `employee` AS `Employee`
INNER JOIN `assigned_jobs` AS `AssignedJobs` ON
    `Employee`.`id` = `AssignedJobs`.`emp_id`
WHERE
    `assignedJobCount` BETWEEN 0 AND 100
GROUP BY
    `Employee`.`id`
ORDER BY
    `Employee`.`id` ASC
LIMIT 20;',
  parameters: undefined
}
SequelizeDatabaseError: Unknown column 'assignedJobCount' in 'where clause'

【问题讨论】:

    标签: mysql sql node.js sequelize.js


    【解决方案1】:

    我通过将where 子句转换为having 子句来修复它,如下所示。

    db.Employee.findAll({
        having: {
          assignedJobCount: {
            [Op.between]: [0, 100],
          },
        },
        include: [
          {
            model: db.AssignedJob,
            required: true,
            attributes: ['emp_id'],
          },
        ],
        attributes: [
          'id',
          'alternate_mobile',
          ['employee_unique_id', 'unique_id'],
          [Sequelize.fn('COUNT', Sequelize.col('AssignedJobs.emp_id')), 'assignedJobCount'],
        ],
        order: [['id', 'ASC']],
        subQuery: false,
        group: ['Employee.id'],
        limit: 20,
      });
      return JSON.parse(JSON.stringify(mechanics));
    };
    

    【讨论】: