Как правильно подготовить параметры с помощью DoctrineDBAL по следующему запросу?

0

Мне нужно получить процент от всех возможных значений в столбце field сравнению с общим value моей таблицы.

Я нашел два способа получить результат в SQL:

SELECT m.field, sum(m.value) * 100 / t.total
FROM my_table AS m 
    CROSS JOIN (
        SELECT SUM(value) AS total FROM 
        WHERE year = 2000) t
WHERE m.year = 2000
GROUP BY m.field, t.total

А также

SELECT m.field, sum(m.value) * 100 / (SELECT SUM(value) AS total FROM WHERE year = 2000)
FROM my_table AS m 
WHERE m.year = 2000
GROUP BY m.field

Но оба являются вложенными запросами, и я не знаю, как подготовить статуты с Doctrine QueryBuilder к вложенным запросам.

Есть ли способ сделать это?

Теги:
sql-server
prepared-statement
doctrine2

2 ответа

1

Я пытался сделать это с помощью querybuilder и DQL без успеха. Как кажется, DQL не разрешает операции с подзапросами в SELECT. Что я до сих пор добился:

$subQuery = $em->createQueryBuilder('m')
                ->select("SUM(m.value)")
                ->where("m.year = 2000")
                ->getDQL();

Следующий запрос работает, хотя не вычисляет процент:

$query = $em->createQueryBuilder('f')
                ->select("f.field")
                ->addSelect(sprintf('(%s) AS total', $subQuery))
                ->addSelect('(SUM(f.value)*100) AS percentage')
                ->where("f.year = 2000")
                ->groupBy("f.field")
                ->getQuery()
                ->getResult();

Однако, если вы попытаетесь добавить деление в select, чтобы получить процент, и вы используете подзапрос, он просто не работает. Похоже, конструкция, которую она не допускала в DQL. Я пробовал с псевдонимом и с подзапросом напрямую, и ни один из них не работал.

Не работает:

$query = $em->createQueryBuilder('f')
                    ->select("f.field")
                    ->addSelect(sprintf('(%s) AS total', $subQuery))
                    ->addSelect('(SUM(f.value)*100)/total AS percentage')
                    ->where("f.year = 2000")
                    ->groupBy("f.field")
                    ->getQuery()
                    ->getResult();

Не работает:

$query = $em->createQueryBuilder('f')
                    ->select("f.field")
                    ->addSelect(sprintf('(SUM(f.value)*100)/(%s) AS percentage', $subQuery))
                    ->where("f.year = 2000")
                    ->groupBy("f.field")
                    ->getQuery()
                    ->getResult();

Я бы предложил использовать SQL напрямую (это позволяет Doctrine). Использование собственных запросов sql и сопоставление результатов могли бы сделать трюк. В этом нет недостатка.

Документация

Если вы найдете способ сделать это с помощью queryBuilder или DQL, сообщите мне.

Надеюсь, поможет.

0

да уж! решение:

 $qs = $this
    ->createQueryBuilder('h');
    $d = $qs ->select($qs->expr()->count('h'));
    $e =  $d->getQuery()->getScalarResult();
    $qs->addSelect('(COUNT(h.id)*100 / :t) AS percentage')->setParameter('t', $e);
    $qs->addGroupBy(sprintf('h.%s', $type));
    return $qs->getQuery()->getResult();

Ещё вопросы

Сообщество Overcoder
Наверх
Меню