1

任何人都有一个示例如何在 zend 分页器适配器中使用 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

来自 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');
于 2012-04-28T19:56:03.917 回答