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 和 order by 中。所以值得重申的是,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. 在 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 回答
3

如果您希望您的 Repository 方法返回一个您不能使用的实体->select(),但您可以使用->addSelect()隐藏的选择。

$qb = $this->createQueryBuilder('q') ->addSelect('COUNT(q.id) AS HIDDEN counter') ->orderBy('counter'); $result = $qb->getQuery()->getResult();

$result将是一个实体类对象。

于 2017-04-26T11:43:36.363 回答
-2

请尝试此代码用于 ci 2 + 学说 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 回答