17

エンティティをフィールド (年) でグループ化し、その数を数えようとしています。

コード:

public function countYear()
{
    $qb = $this->getEntityManager()->createQueryBuilder();
    $qb->select('b.year, COUNT(b.id)')
        ->from('\My\Entity\Album', 'b')
        ->where('b.year IS NOT NULL')
        ->addOrderBy('sclr1', 'DESC')
        ->addGroupBy('b.year');
    $query = $qb->getQuery();
    die($query->getSQL());
    $result = $query->execute();
    //die(print_r($result));
    return $result;
}

エラーが出て何とも言えないようで、値COUNT(b.id) AS countとして何を使えばいいのかわからない?addOrderby(???, 'DESC')

4

4 に答える 4

47

v2.3.0 以下では、式による順序を実現するために必要な多くのバグと回避策があります。

  1. order by 句は式をサポートしていませんが、式を含むフィールドを select に追加して、それによって並べ替えることができます。したがって、Tjorriemorrie 自身のソリューションが実際に機能することを繰り返す価値があります。

    $qb->select('b.year, COUNT(b.id) AS mycount')
       ->from('\My\Entity\Album', 'b')
       ->where('b.year IS NOT NULL')
       ->orderBy('mycount', 'DESC')
       ->groupBy('b.year');
    
  2. Doctrineは、select 式の等価性 (例: =LIKE、 ) でチョークします。IS NULLこれらの場合、私が見つけた唯一の解決策は、サブセレクトまたは自己結合を使用することです。

    $qb->select('b, (SELECT count(t.id) FROM \My\Entity\Album AS t '.
                    'WHERE t.id=b.id AND b.title LIKE :search) AS isTitleMatch')
       ->from('\My\Entity\Album', 'b')
       ->where('b.title LIKE :search')
       ->andWhere('b.description LIKE :search')
       ->orderBy('isTitleMatch', 'DESC');
    
  3. 結果から追加フィールドを抑制するには、それを宣言できますAS HIDDEN。このようにして、結果に含めずに順序で使用できます。

    $qb->select('b.year, COUNT(b.id) AS HIDDEN mycount')
       ->from('\My\Entity\Album', 'b')
       ->where('b.year IS NOT NULL')
       ->orderBy('mycount', 'DESC')
       ->groupBy('b.year');
    
于 2012-11-30T20:13:25.963 に答える
9

使用時に発生するエラーは何COUNT(b.id) AS countですか? countは予約語だからかもしれません。COUNT(b.id) AS idCount、または同様のものを試してください。

または、 を試してください$qb->addOrderby('COUNT(b.id)', 'DESC');

データベース システム (mysql、postgresql、...) は何ですか?

于 2011-05-14T08:46:40.677 に答える
-2

このコードを ci 2 + doctrine 2 で試してください

$where = " ";

$order_by = " ";
$row = $this->doctrine->em->createQuery("select a from company_group\models\Post a " 
            .$where." ".$order_by."")
            ->setMaxResults($data['limit'])
            ->setFirstResult($data['offset'])
            ->getResult();`
于 2012-03-15T18:16:05.333 に答える