忽略重复的数字的学说限制
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);
希望对您有所帮助:)
我正在使用 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);
希望对您有所帮助:)