Doctrine запрос Builder создает случайную синтаксическую ошибку - PullRequest
0 голосов
/ 07 сентября 2018

В настоящее время я ухожу с доктриной, и последние 2 часа я пытался сделать выбор, чтобы получить сумму для определенного поля, но только когда логическое значение истинно, а затем другой выбор для сумма этого поля, когда логическое значение ложно

Я пытался сделать свой выбор как:

sum(case when (f.prevision = 1) then f.total end)
sum(case when (f.prevision = 0) then f.total end)

а потом у меня есть другие, которые выбирают и присоединяются, но те не так важны. Дело в том, что учение выдает ошибку:

[Syntax Error] line 0, col 212: Error: Unexpected ')'

И я попытался выбрать консоль с помощью собственного SQL, например:

SELECT sum(case when prevision = 1 then total end)
from membre_facturation
GROUP BY id_utilisateur

и не имеют ошибки, и даже ожидаемого результата. Что-то не так с доктриной и постановкой дела?

Заранее спасибо за вашу помощь. И извините, если чего-то не хватает, я не хотел писать слишком много кода, что было бы «слишком много» * ​​1014 *

Ответы [ 3 ]

0 голосов
/ 07 сентября 2018

Просто:

SELECT coalesce(sum(m.prevision), 0) as sumOfPrevision
from membre_facturation as m
GROUP BY m.id_utilisateur

В Учении2:

$this->createQueryBuilder('m')
     ->select('coalesce(sum(m.prevision = 1), 0) as sumOfPrevision') ## for true
     | OR |
     ->select('coalesce(sum(m.prevision = 0), 0) as sumOfPrevision') ## for false
     ->orderBy('m.id_utilisateur')
     ->getQuery()
     ->getResult();
0 голосов
/ 07 сентября 2018

Хорошо, я пытался немного больше офлайн, чем, не видя вашего ответа. И похоже, что в случае построителя запросов оператор ELSE не является обязательным. Я написал свой запрос как:

sum(case when (f.prevision = 1) then f.total else 0 end)

И это действительно работает. Я также проверю функцию объединения. Может быть, это тоже будет работать. Или, может быть, я делал что-то еще не так, но дело в том, что добавление оператора else уладило все для меня.

Есть идеи, если один быстрее другого? Из того, что я видел, "CASE" и "COALESCE" очень похожи.

0 голосов
/ 07 сентября 2018

Вместо случая этот макет работает у вас?

select sum(f.total) 
from f
where f.prevision = 1
...