Javascript 在findAll中对计数关联进行续集

Javascript 在findAll中对计数关联进行续集,javascript,node.js,postgresql,sequelize.js,Javascript,Node.js,Postgresql,Sequelize.js,假设您有一个队列表、代理队列和代理表。一个代理可以位于多个队列中,一个队列可以有多个代理。现在,假设您正在尝试获取队列列表以及这些队列中的代理数。我希望以下类似的方法能够奏效: queues.findAll({ include: ['agentQueues'], group: ['queues.name', 'queues.matcher', 'queues.id'], attributes: [[Sequelize.fn('count', Sequelize.co

假设您有一个队列表、代理队列和代理表。一个代理可以位于多个队列中,一个队列可以有多个代理。现在,假设您正在尝试获取队列列表以及这些队列中的代理数。我希望以下类似的方法能够奏效:

queues.findAll({
     include: ['agentQueues'],
     group: ['queues.name', 'queues.matcher', 'queues.id'],
     attributes: [[Sequelize.fn('count', Sequelize.col('agentQueues.id')), 'agentCount']]
  })
相反,它会产生如下结果:

SELECT "queues".*
FROM (SELECT
        "queues"."name",
        "queues"."matcher",
        "queues"."id",
        count("agentQueues"."queueId") AS "agentCount"
      FROM "queues" AS "queues"
      GROUP BY "name", "matcher", "id"
     ) AS "queues" LEFT OUTER JOIN "agent_queues" AS "agentQueues" ON "queues"."id" = "agentQueues"."queueId";
其中,GROUPBY和count都位于子查询中,而不是主查询中。我做错了什么

理想的查询如下所示:

SELECT name, matcher, count(agent_queues."queueId") as agentCount FROM queues
LEFT OUTER JOIN agent_queues ON "agent_queues"."queueId" = queues.id
GROUP BY name, matcher;
[{ name: 'Some Queue', matcher: '1 = 1', agentCount: 2 }]
我想要的结果是这样的:

SELECT name, matcher, count(agent_queues."queueId") as agentCount FROM queues
LEFT OUTER JOIN agent_queues ON "agent_queues"."queueId" = queues.id
GROUP BY name, matcher;
[{ name: 'Some Queue', matcher: '1 = 1', agentCount: 2 }]

这是一个有点老的问题,但新版本的sequelize也存在这个问题。我最好的解决方法是使用
literal
而不是
fn
count
函数

这段代码应该生成您期望的sql语句

queues.findAll({
     group: ['queues.name', 'queues.matcher'],
     attributes: ['name', 'matcher',[literal(`(SELECT count(*) FROM "agentQueues" 
                                WHERE queue."id" = "agentQueues"."queueId"])`, 'agentCount')]]
  })