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 混合使用吗?

Doctrine2 查询(Builder)在使用“where”和“in”子句后失去关系

Symfony Query Builder join ON 和 WITH 区别