Doctrine Query Builder选择Count with Case

时间:2015-07-30 21:40:16

标签: php sql symfony doctrine-orm

我有以下要转换为doctrine查询构建器的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次。

2 个答案:

答案 0 :(得分:4)

正如vkp所提到的,您可以使用SUM但不是将评分相加,而是将1或0相加以模拟COUNT

SUM(CASE WHEN r.rating = 1 THEN 1 ELSE 0 END)

答案 1 :(得分:4)

要根据另一列中的值计算一列中的不同ID,模糊树的答案在这种情况下不起作用。

要仅计算不同的值,您应该将null作为参数并将其设置为null,如:

->addSelect('COUNT(DISTINCT(CASE WHEN r.rating = 1 THEN rating.rating ELSE :nada END)) as rat_1')
->setParameter(':nada', null)