2014-01-15 71 views
1

我嘗試用「獨特的」教義,但我得到了以下錯誤:如何在教條上使用「distinct on」?

Error: Expected known function, got 'on'

class Report extends EntityRepository 
{ 
    public function findForList() { 
     $queryBuilder = $this->createQueryBuilder('r'); 
     $queryBuilder->select('distinct on (r.parentId)') 
        ->orderBy('r.parentId') 
        ->orderBy('r.date', 'DESC'); 

     return $queryBuilder->getQuery()->getResult(); 
    } 
} 

我怎麼能實現以下查詢?

select distinct on (r.parent_id) 
    r.parent_id, 
    r.id, 
    r.name 
from frontend.report r 
order by r.parent_id, r.date desc; 

顯然,這似乎並不可能與查詢生成器來做到這一點。我試圖重寫我的查詢方式不同:

select * from frontend.report r 
where 
r.id in (
select distinct 
    (select r3.id from frontend.report r3 
    where r3.parent_id = r.parent_id 
    order by r3.date desc limit 1) AS id 
from frontend.report r2); 

但教義不支持LIMIT:

public function findForList() { 
    $qb3 = $this->_em->createQueryBuilder(); 
    $qb3->select('r3.id') 
     ->from('MyBundle:frontend\report', 'r3') 
     ->where('r3.parentId = r2.parentId') 
     ->orderBy('r3.date', 'DESC') 
     //->setMaxResults(1) 
      ; 

    $qb2 = $this->_em->createQueryBuilder(); 
    $qb2->select('(' . $qb3->getDql() . ' LIMIT 1)') 
     ->from('MyBundle:frontend\report', 'r2') 
     ->distinct(); // groupBy('r2.parentId') 

    $queryBuilder = $this->createQueryBuilder('r'); 
    $queryBuilder->where(
     $queryBuilder->expr()->in('rlt.id', $qb2->getDql()) 
    ); 

    return $queryBuilder->getQuery()->getResult(); 
} 

我認爲唯一的解決辦法就是使用原生SQL查詢。

回答

-2

只需卸下on字:

$queryBuilder->select('distinct r.parentId') 
      ->orderBy('r.parentId') 
      ->orderBy('r.date', 'DESC'); 
+0

但我需要一個獨特的,而不是一個簡單的區別!另外我發現用select()我們需要使用from()。 – Alexandre

0

這種反應是有人又尋找類似案件的解決方案。 如果你需要一個樣本「DISTINCT」你可以使用:

$queryBuinder->select('parentId') 
      ->distinct('parentId'); 

,但如果你想有一個「DISTINCT ON」你應該使用本地SQL,而不是查詢生成器,看看這裏的手冊:Doctrine Native SQL

相關問題