2016-12-16 61 views
-2

我有一個測驗應用程序,其中在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應該如何?

回答

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而不是對象

+0

謝謝你的評論幫助我找到最佳解決方案 – ACs

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'設置爲參數,則會出現錯誤。最後,我必須指出不同的用戶得到正確的結果。