Я пытаюсь получить ряд строк с уникальными uids.
$qb->select('COUNT() as cnt') ->from($type, 'c') ->groupBy('c.organization, c.process_role, c.domain, c.year') ->getQuery()->getSingleScalarResult()
Но он возвращает массив групповых подсчетов. Как мне написать это правильно?
Наконец, это работает, но это некрасиво
$count = $this->_em->createQuery( 'SELECT COUNT(c.id) FROM '.$type.' as c WHERE c.id IN (' . 'SELECT c1.id FROM ' . $type . ' c1 ' . 'GROUP BY c1.organization, c1.process_role, c1.domain, c1.year)') ->getSingleScalarResult();
Попробуйте разбить одну groupBy
в функции addGroupBy
:
$qb->select('COUNT(c) as cnt') ->from($type, 'c') ->groupBy('c.organization') ->addGroupBy('c.process_role') ->addGroupBy('c.domain') ->addGroupBy('c.year') ->getQuery()->getSingleScalarResult();
Однако это фактически возвращает то же самое, поскольку оно просто группирует результаты в уникальные множества этими 4 переменными. Вместо этого вы должны использовать метод выбора DISTINCT
и подсчитывать полученные строки.
$rows = $this->getDoctrine()->getManager() ->createQuery( 'SELECT DISTINCT c.organization, c.process_role, c.domain, c.year FROM ' . $type . ' c' ) ->getArrayResult(); $count = count($rows);
Это единственный известный мне метод, который будет работать, поскольку DQL не будет поддерживать какие-либо альтернативные стратегии (например, SELECT COUNT(*) FROM (SELECT DISTINCT ... )
)
Insted из $qb->select();
используйте $qb->distinct();
, Надеюсь это работает.