findAll中的计数关联
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了findAll中的计数关联相关的知识,希望对你有一定的参考价值。
假设您有一个队列表,agent_queues和agents表。一个代理可以位于多个队列中,一个队列可以具有多个代理。现在,假设您正在尝试获取队列列表以及这些队列中的代理数量。我希望可以进行以下操作:
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 }]
答案
这是一个有点老的问题,但是新版本的续集也存在这个问题。我最好的解决方法是使用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')]]
})
以上是关于findAll中的计数关联的主要内容,如果未能解决你的问题,请参考以下文章
EF添加关联的提示问题:映射从第 260 行开始的片段时有问题: