我有一个测验应用程序,在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应该怎么样?
答案 0 :(得分:2)
试试这个
$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而不是对象
答案 1 :(得分:1)
用户可以多次播放的其他信息,因此用户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'
而不是设置为参数,则会出现错误。最后,我必须统计不同的用户,以获得正确的结果。