Doctrine Query Builder Select Count with Case
Posted
技术标签:
【中文标题】Doctrine Query Builder Select Count with Case【英文标题】: 【发布时间】:2015-10-22 10:43:28 【问题描述】:我有以下 sql 语句,我想将其转换为学说查询生成器。目标是计算评分值为 1 和评分值为 2 的评分数量。
SELECT
COUNT(CASE WHEN rating.rating = 1 THEN rating.rating END) as rat1,
COUNT(CASE WHEN rating.rating = 2 THEN rating.rating END) as rat2
FROM rating
这个 sql 语句运行良好 - 但是当我尝试将其转换为 Doctrine 语句时,它不再运行了。当什么都不应该被计算时(因为这个值不存在评级),它返回一个“1”而不是一个 0。当没有什么可以计算时,我如何告诉教义简单地返回一个零? 我通过删除 "ELSE 0" 进行了尝试,但随后我收到一个错误,提示此部分是必需的..
return $qb
->addSelect('COUNT(CASE WHEN r.rating = 1 THEN r.rating ELSE 0 END) as rat_1')
->addSelect('COUNT(CASE WHEN r.rating = 2 THEN r.rating ELSE 0 END) as rat_2')
->getQuery()
->getResult();
问候,
"sum" 不是必需的 - 例如: 投票 2,2,2,2,2 应该返回 5 ,因为值为 2 的评级被投票了 5 次。
【问题讨论】:
使用sum
而不是 count
来获得你需要的东西。
嘿,我不想总结值 1+1+1+1 或 2+2+2+2+,我想计算一个值的评分频率,例如2+2+2+2 = 4(值为 2 的评级的时间)。问候
【参考方案1】:
要根据另一列中的值计算一列中的不同 id,模糊树的答案在这种情况下不起作用。
要仅计算不同的值,您应该将 null 作为参数并将其设置为 null,例如:
->addSelect('COUNT(DISTINCT(CASE WHEN r.rating = 1 THEN rating.rating ELSE :nada END)) as rat_1')
->setParameter(':nada', null)
【讨论】:
谢谢!我试图在 case 语句中设置 null 并不断收到错误。将其设置为参数效果很好。【参考方案2】:正如 vkp 所提到的,您可以使用 SUM
,但不是将评级相加,而是将 1 或 0 相加来模拟COUNT
SUM(CASE WHEN r.rating = 1 THEN 1 ELSE 0 END)
【讨论】:
正是我需要的。所以这是解决方法,因为我不能在这里直接使用 Count 吗?谢谢。 您的编辑评论是错误的 - 使用 dql 时会抛出“错误:意外的 'NULL'”。 SUM - 建议运行良好。 Sum 在您需要根据另一列中的值计算一列中的不同值时没有帮助。对于这种情况,请参阅下面的答案。以上是关于Doctrine Query Builder Select Count with Case的主要内容,如果未能解决你的问题,请参考以下文章
Doctrine Query Builder,“介于”表达式和子查询之间
Doctrine Query Builder,“between”表达式和子查询
Doctrine Query Builder Select Count with Case
Doctrine DBAL 可以与 ORM Query Builder 混合使用吗?