【问题标题】:Sequelize count associations in findAll在 findAll 中序列化计数关联
【发布时间】:2018-05-05 13:18:48
【问题描述】:

假设您有一个 queues 表、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 }]

【问题讨论】:

    标签: javascript node.js postgresql sequelize.js


    【解决方案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')]]
      })
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-01-19
      • 2011-09-20
      • 2019-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多