14 июля 2011 г.

Zend_Db_Select + UNION + COUNT

Часто бывает нужно вывести часть данных и показать сколько ещё осталось. Сделать это можно разными способами, в данном случае я использую 2 отдельных запроса.
Весело становится когда запрос на выборку данных у нас составляется UNION-ами, к которому простой COUNT(*) не применить толком =)

Нашёл лаконичное решение через пагинатор.


Составляем запрос


Copy Source | Copy HTML
  1. //составляем запрос с UNION
  2.         $selectDom = $this->select()
  3.                 ->setIntegrityCheck(false)
  4.                 ->from($this,
  5.                         array( 'id' => 'players_trans_dom.id_player', 'nik', 'id_rase',
  6.                             'old_adr' => "CONCAT( ring, '.', old_compl, '.', old_sota)",
  7.                             'new_adr' => "CONCAT( ring, '.', new_compl, '.', new_sota)" ))
  8.                 ->join('players_trans_dom', 'players.id = players_trans_dom.id_player', array('date' => "FROM_UNIXTIME(players_trans_dom.date , '{$dataFormat}')" ))
  9.                 ->where('players_trans_dom.date < ?', $end)
  10.                 ->where('players_trans_dom.date >= ?', $begin);
  11.  
  12.         $selectCol = $this->select()
  13.                 ->setIntegrityCheck(false)
  14.                 ->from($this,
  15.                         array( 'id' => 'players_trans_colony.id_player', 'nik', 'id_rase',
  16.                             'old_adr' => "CONCAT( '4.', old_compl, '.', old_sota)",
  17.                             'new_adr' => "CONCAT( '4.', new_compl, '.', new_sota)" ))
  18.                 ->join('players_trans_colony', 'players.id = players_trans_colony.id_player', array('date' => "FROM_UNIXTIME(players_trans_colony.date , '{$dataFormat}')" ))
  19.                 ->where('players_trans_colony.date < ?', $end)
  20.                 ->where('players_trans_colony.date >= ?', $begin);
  21.  
  22.         $select = $this->select()
  23.                 ->union(array($selectDom, $selectCol))
  24.                 ->order("date DESC")
  25.                 ->limit( ( $isAlliance == true || $nolimit == false ) ? $limit : 200 );

Узнаём общее количетсво итемов, которое может быть выбрано таковым запросом без лимита


Copy Source | Copy HTML
  1. $adapter = new Zend_Paginator_Adapter_DbSelect($select);
  2. $count = $adapter->count();



Вот и всё. Переменная count содержит искомое число.

Комментариев нет: