Раздел вопрос-ответ Symfony doctrine: select количества одинаковых значений

На чистом sql запрос бы был таким:

SELECT email, count(*) as cnt FROM subscriber GROUP BY email;

Как в symfony лучше всего составить запрос, который бы вернул количество одинаковых значений для каждого значения?

mysql> SELECT email, count(*) as cnt FROM subscriber GROUP BY email;
+-----------------+-----+
| email           | cnt |
+-----------------+-----+
| test@gmail.com  |   1 |
| test2@gmail.com |   3 |
+-----------------+-----+
2 rows in set (0,00 sec)

Такое не работает:

$subscriber = $em->getRepository('AppBundle:Subscriber')->createQueryBuilder('s')
    ->select('COUNT() as cnt')
    ->distinct()
    ->groupBy('s.email')
    ->getQuery();

$subscribers = $subscriber->getResult();

 

share

1 ответ

Чтобы не оставлять свой же вопрос без ответа...

Чтобы посчитать количество COUNT мы можем использовать доктриновский queryBuilder. Код можно вставить в любой из методов в наследниках EntityRepository.

return $this->createQueryBuilder('s')
            ->select('s.email', 'COUNT(s.email) as cnt')
            ->groupBy('s.email')
            ->getQuery()
            ->getResult();

Результатом запроса будет массив ассоциативных массивов:

Doctrine count with group by result

В продолжение, чтобы отсортировать по наибольшему количеству имэйлов, можно добавить orderBy и having чтобы исключить из выборки имэйлы в единственном экземпляре:

return $this->createQueryBuilder('s')
    ->select('s.email', 'COUNT(s.email) as cnt')
    ->groupBy('s.email')
    ->orderBy('cnt', 'DESC')
    ->having('cnt > 1')
    ->getQuery()
    ->getResult();

Все также, как чистом SQL.

Добавить комментарий
    как минимум 5 символов

    icon Вход в систему

    зарегистрироваться