我有一个测验应用程序,其中播放弹奏在UserPerformanceEntity
中记录。相应的mySQL表看起来像:
UserPerformance
---------------
id (PK)
user
start_time
end_time
max_level
我想显示一些统计信息,例如"您的表现要比X%的玩家的表现更好"。要计算出比当前要执行以下MySQL查询的当前情况更差的球员的百分比:
SELECT COUNT(DISTINCT `user`)
FROM `UserPerformance`
WHERE
(end_time IS NOT NULL
AND end_time NOT LIKE '0000-00-00 00:00:00')
AND `user` != :current_user
AND max_level < :current_level
ORDER BY max_level DESC
,但我不知道如何用学说实施这一点。我的QueryBuilder应该如何?
尝试此
$query = $this->createQueryBuilder('u');
$query->select('COUNT(DISTINCT u.id) as usercount')
->where('u.end_time IS NOT NULL')
->andWhere('u.end_time NOT LIKE :end_time')
->andWhere('u.id != :current_userid')
->andWhere('u.max_level < :current_level')
->setParameter('end_time', '0000-00-00 00:00:00')
->setParameter('current_userid', $current_userid)
->setParameter('current_level', $current_level)
->setMaxResults(1);
$result = $query->getQuery()->getResult();
return $result[0]['usercount'] ;
唯一的更改是,您需要当前用户的ID,而是对象
用户可以播放多次的其他信息,因此用户ID不是唯一的,一个用户可以拥有许多记录。这是我的解决方案:
$em = $this->getDoctrine()->getManager();
$qb = $em->createQueryBuilder();
$result = $qb->select('COUNT(DISTINCT p.user) AS usercount')
->from('LoginetFBappVagoBundle:UserPerformanceEntity', 'p')
->where(
$qb->expr()->andX(
$qb->expr()->isNotNull('p.endTime'),
$qb->expr()->neq('p.endTime', ':endTime')))
->andWhere($qb->expr()->neq('p.user', ':userId'))
->andWhere($qb->expr()->lt('p.maxLevel', ':maxLevel'))
->setParameter('endTime', '0000-00-00 00:00:00')
->setParameter('userId', $userid)
->setParameter('maxLevel', $level)
->getQuery()
->getResult();
我从@Alexander Keil的答案开始,但是我使用了表达式,我发现无需将(end_time IS NOT NULL AND end_time NOT LIKE '0000-00-00 00:00:00')
部分分组。但是,如果我将'0000-00-00 00:00:00'
传递在表达式中,而不是将其设置为参数,则会出现错误。最后,我必须计算不同的用户获得正确的结果。