【问题标题】:Doctrine Query Builder Select Count with CaseDoctrine 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 的评级的时间)。问候

标签: php sql symfony doctrine-orm


【解决方案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 在您需要根据另一列中的值计算一列中的不同值时没有帮助。对于这种情况,请参阅下面的答案。
猜你喜欢
  • 2022-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-12
相关资源
最近更新 更多