我有以下要转换为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次。
答案 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)