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



我正在使用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 个结果(因为两个用户的分数相同(。我想要什么

千斤顶

詹姆斯

佛瑞德

米克

丹尼尔

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

结果数返回前 5 个最佳分数,但所有用户都有此分数。

如何编辑我的查询来执行此操作?

您应该使用子查询来选择具有 top5 分数的所有用户,例如:

$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表上,所以它有更多的连接和更多的条件,但它可以提供帮助。

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

希望这对:)有所帮助

相关内容

  • 没有找到相关文章

最新更新