我正在使用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);
希望这对:)有所帮助