在findAll中查询计数关联

时间:2017-11-21 22:35:27

标签: javascript node.js postgresql sequelize.js

假设你有一个队列表,agent_queues和agent表。代理可以在许多队列中,队列可以有许多代理。现在让我们假设您正在尝试获取队列列表以及这些队列中的代理数量。我希望以下内容能够起作用:

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";

其中group by和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 }]

1 个答案:

答案 0 :(得分:1)

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

此代码应生成您期望的sql语句。

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