忽略重复的数字的学说限制

Doctrine limit to a number ignoring duplicate

我正在使用 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

我想要return6个结果(因为两个用户的分数相同)。我想要什么

杰克

詹姆斯

弗雷德

米克

丹尼尔

如果我有其他用户与 Mick 的分数相同,它应该 return 7 结果。

结果数 return 前 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();

希望对您有所帮助

我找到了两个请求的解决方案(如果您有更好的解决方案,请随时说)

这是我的代码,但在我的问题中我简化了文本,实际上我的分数存储在 user_session table 上,所以它有更多的连接和更多的条件,但它可以提供帮助.

首先,我得到所有前 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);

希望对您有所帮助:)