Doctrine Query Builder选择Count with Case

use*_*259 7 php sql symfony doctrine-orm

我有以下sql语句,我想转换为doctrine查询生成器.目标是计算评级值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 
Run Code Online (Sandbox Code Playgroud)

这个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();
Run Code Online (Sandbox Code Playgroud)

问候,

"sum"不是必需的 - 例如:投票2,2,2,2,2应该返回5,因为值为2的评级被投票5次.

zef*_*zef 6

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

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

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


Fuz*_*ree 5

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

SUM(CASE WHEN r.rating = 1 THEN 1 ELSE 0 END)
Run Code Online (Sandbox Code Playgroud)