1

zend paginatorアダプターでleftjoinを使用してグループ化する前に注文する方法の例はありますか?

new Zend_Paginator_Adapter_DbSelect($this->db->select()
->from(array( 'a' => $this->prefix.'contest' ), array('id'))
->joinLeft(array( 'b' => $this->prefix.'logo_to_contest'),'a.id=b.contest_id', array('img'))
->group('a.id')
->order('a.end','a.date_start DESC','b.id RAND()')
)
4

1 に答える 1

2

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');
于 2012-04-28T19:56:03.917 に答える