Tjo*_*rie 15 sql-order-by query-builder doctrine-orm
我正在尝试按字段(年份)对我的实体进行分组并对其进行计数.
码:
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;
}
Run Code Online (Sandbox Code Playgroud)
我似乎无法说,COUNT(b.id) AS count因为它给出了一个错误,我不知道该用什么作为addOrderby(???, 'DESC')值?
b7k*_*ich 45
从v2.3.0或更低版本开始,表达式需要很多错误和解决方法:
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');
Run Code Online (Sandbox Code Playgroud)教义扼流圈上平等(例如=,LIKE,IS NULL)在选择表达.对于这些情况,我发现的唯一解决方案是使用subselect或self-join:
$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');
Run Code Online (Sandbox Code Playgroud)要从结果中抑制其他字段,可以声明它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');
Run Code Online (Sandbox Code Playgroud)使用时会出现什么错误COUNT(b.id) AS count?这可能是因为count是一个保留字.尝试COUNT(b.id) AS idCount,或类似.
或者,试试$qb->addOrderby('COUNT(b.id)', 'DESC');.
你的数据库系统是什么(mysql,postgresql,...)?