Doctrine2选择distinct with orderby(case when)

时间:2012-08-23 23:30:30

标签: symfony doctrine-orm

我在doctrine2上遇到了一些麻烦。我想订购一个查询,但是按星期几。

我的意思是:

如果指定日期的日期为Tuesday,我希望按Tuesday, Wednseday, ..., Sunday, Monday排序。

但表演可能有多天。

我在这里获得的代码通过

来完成订单的诀窍
public function getValidPerformancesByDay2($date, $max = 25, $from, $asSql = false){

    $myday = intVal(date('w',strtotime($date)));
    $q = $this->getEntityManager()
             ->createQueryBuilder()
             ->select('DISTINCT textdesc, 
              CASE WHEN (perfdays.id < '. $myday .') THEN perfdays.id + 8 
                   ELSE perfdays.id END AS HIDDEN sortvalue')
             ->from ('sys4winsegundaBundle:Performance','textdesc')
             ->join('textdesc.days', 'perfdays')
             ->where ('textdesc.enddate >= :date')
             ->andWhere('textdesc.isvalid = true')
             ->orderBy('sortvalue','ASC')
             ->setMaxResults($max)
             ->setFirstResult($from)
             ->setParameter('date',$date)
             ;

    $query = $q->getQuery();                   
    if ($asSql){
        return $query;
    }

    return $query->getResult();
}

但不幸的是,当我查看已发送的查询时,它是:

SELECT DISTINCT p0_.id AS id0, p0_.name AS name1, p0_.duration AS duration2,
 p0_.addedby AS addedby3, p0_.startdate AS startdate4, p0_.enddate AS enddate5,
 p0_.starthour AS starthour6, p0_.flyer AS flyer7, p0_.price AS price8,
 p0_.discount AS discount9, p0_.isvalid AS isvalid10, 
 p0_.archivedon AS archivedon11, p0_.description AS description12,
 p0_.weblink AS weblink13, p0_.techinfo AS techinfo14, p0_.slug AS slug15,
 CASE WHEN (d1_.id < 4) THEN d1_.id + 8 ELSE d1_.id END AS sclr16,
 p0_.place_id AS place_id17, p0_.gallery_id AS gallery_id18 FROM performances
 p0_ INNER JOIN performance_day p2_ ON p0_.id = p2_.performance_id
 INNER JOIN days d1_ ON d1_.id = p2_.day_id WHERE p0_.enddate >= ? AND
 p0_.isvalid = 1 ORDER BY sclr16 ASC OFFSET 0
Parameters: ['2012-08-23']
Time: 5.13 ms 

这意味着如果表演每周发生3次,我会发生3次。

有人有个主意吗?


修改  我的英语非常糟糕,我想以不同的方式解释它: 好吧,我在不同的日子里都有艺术表演。

我想要的是按时间最近的顺序排序。 但我将它发送到数据库的方式是一个开始日期,一个结束日期,然后它发生的日期(星期二,星期三......)

我的查询执行此操作(按最近的一个排序),但由于某些表现发生在例如星期三的星期五,我的查询将返回该表演2次(on为wednsday,另一个为星期五),而我应该只检索每次演出都会出现,但顺序相同(最近的)

1 个答案:

答案 0 :(得分:0)

如果您希望每周发生一次,请使用

$q->groupBy()

转换为周数的日期。并在您的选择中使用count()。我不确定我理解你的问题。