来自 mysql 手册
一般来说,使用的子句必须完全按照语法描述中显示的顺序给出。例如,HAVING 子句必须在任何 GROUP BY 子句之后和任何 ORDER BY 子句之前。例外是 INTO 子句可以出现在语法描述中,也可以紧跟在 select_expr 列表之后。
并且在语法描述中group 位于 order 之前,因此它与 zend 无关,它是 mysql 要求您将 group 放在 order 之前。
但是,要解决此问题并在订购后进行分组,您可以使用带有顺序的子查询进行选择,然后在新的选择上分组,例如:
$subselect = $db->select()
->from(array( 'a' => $this->prefix.'contest' ), array('id'))
->joinLeft(array( 'b' => $this->prefix.'logo_to_contest'),'a.id=b.contest_id', array())
->order('a.end','a.date_start DESC','b.id RAND()');
$select = $db->select()->from(a(array( 'a' => $this->prefix.'contest' ), array('id'))
->joinLeft(array( 'b' => $this->prefix.'logo_to_contest'),'a.id=b.contest_id', array('img'))
->where("a.id in ($subselect)")
->group('a.id');