mysqlmanuelから
一般に、使用される句は、構文の説明に示されている順序で正確に指定する必要があります。たとえば、HAVING句は、GROUP BY句の後、ORDERBY句の前に配置する必要があります。例外は、INTO句が構文の説明に示されているように、またはselect_exprリストの直後に表示される可能性があることです。
構文の説明では、グループは注文の前に来るので、zendとは何の関係もありません。注文の前にグループを置く必要があるのはmysqlです。
ただし、この問題を回避して注文後にグループ化するには、注文を含むサブクエリで選択してから、次のような新しい選択でグループ化します。
$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');