Доктрина ограничена числом, игнорирующим дубликат - PullRequest
0 голосов
/ 05 октября 2018

Я использую Symfony 3.4, и у меня есть запрос в моем хранилище пользователей.

Я хочу, чтобы 5 лучших пользователей основывались на оценке.Таким образом, я создал свой запрос с заказом по столбцу оценки и ограничением до 5 результатов.

  $query =  $this->createQueryBuilder('u')
            ->orderBy('u.score', 'DESC')
            ->setMaxResults(5)
            ->getQuery()
            ->getResult();

Но я хочу, чтобы 5 лучших получили пользователя с таким же счетом.Например, с:

Пользователь: Оценка

Джек: 100

Мик: 50

Джо: 10

Даниил: 25

Фред: 75

Джеймс: 100

Билли: 2

Я хочу вернуть 6 результатов (потому что два пользователя имеют одинаковый счет).Что я хочу

Джек

Джеймс

Фред

Мик

Даниэль

Джо

И если у меня есть другой пользователь с таким же счетом, что и Мик, он должен вернуть результат 7.

Число результатов возвращает 5 лучших результатов, но со всеми пользователями с таким счетом.

Как мне отредактировать мой запрос, чтобы сделать это?

Ответы [ 2 ]

0 голосов
/ 05 октября 2018

Я нашел решение с двумя запросами (не стесняйтесь сказать, если у вас есть лучшее решение)

Это мой код работает, но в моем вопросе я упрощаю текст, в действительности мой счет хранится наТаблица user_session, так что у нее больше соединений и больше условий, но это может помочь.

Сначала я получаю все 5 лучших баллов с отдельной группой одинаковых баллов.

$now = new \DateTime();
        $leaderScore = $this->createQueryBuilder('u')
            ->select('us.score')
            ->join('u.sessionUsers', 'us')
            ->join('us.session', 's')
            ->where(':now BETWEEN s.start_date AND s.end_date')
            ->setParameter('now', $now)
            ->setMaxResults(self::NUMBER_LEADERS_DISPLAY)
            ->distinct()
            ->orderBy('us.score', 'DESC')
            ->getQuery()
            ->getResult();

Я сохраняюхудший результат из 5 лучших:

$minScore = min($leaderScore);

И я делаю еще один запрос, чтобы получить всех пользователей с более высоким или равным счетом, чем $ minScore

 $query =  $this->createQueryBuilder('u')
            ->join('u.sessionUsers', 'us')
            ->join('us.session', 's')
            ->where(':now BETWEEN s.start_date AND s.end_date')
            ->andWhere('u.roles LIKE :role')
            ->andWhere('us.score >= :minScore')
            ->orderBy('us.score', 'DESC')
            ->setParameter('now', $now)
            ->setParameter('role', '%PLAYER%')
            ->setParameter('minScore', $minScore);

Надеюсь, эта помощь:)

0 голосов
/ 05 октября 2018

Вы должны использовать подзапрос, выбирая всех пользователей, которые набрали 5 баллов, например:

$subQuery =  $this->createQueryBuilder('u1')
            ->select('DISTINCT u1.score')
            ->orderBy('u1.score', 'DESC')
            ->setMaxResults(5)
            ->GetDQL();

$query = $this->createQueryBuilder('u2');

$query->where(
             $query->expr()->in(
                    'u2.score', $subquery))
            ->orderBy('u2.score', 'DESC')
            ->getQuery()
            ->getResult();

Надеюсь, эта помощь

...