2011-09-12 5 views
2

На Zend_Db_Table_Abstract Я использую этот код, чтобы получить количество результатов для моего выбора:Zend_Db_Table_Abstract подсчитывать

$this->setTableName('visitors'); 
$select = $this->select() 
       ->from('visitors') 
       ->columns(array('total' => new Zend_Db_Expr('COUNT(*)'))) 
       ->where('...'); 
$visits = $this->_fetch($select); 

Есть ли лучший способ, то есть, просто чтобы вернуть счетчик. Это возвращает некоторые другие данные в массиве ... Я просто хочу подсчет результатов. В прямом MySql эквивалент будет select count( Mycol ) from visitors where ....

+2

только сосчитать. '$ count = (int) $ this-> getAdapter() -> fetchOne ($ select);' try :) – SMka

+0

'fetchOne()' Получает первый столбец первой строки результата SQL. – SMka

ответ

4

Это проверялось, но вы должны получить начали:

$results = $this->getAdapter() 
    ->query("SELECT COUNT(*) AS total FROM visitors WHERE ...") 
    ->fetchAll(); 
$visits = $results[0]["total"]; 

Вы не обязаны использовать Table/Select интерфейс для каждого запроса.


обновление: +1 к комментарию от @SMka, указывающих на то, что это может быть еще проще:

$visits = $this->getAdapter() 
    ->fetchOne("SELECT COUNT(*) AS total FROM visitors WHERE ..."); 
+0

Ваше последнее предложение - это облегчение! – Owen

+1

Я работал над Zend_Db_Select, и я попытался прояснить в документах, что интерфейс должен помочь, когда вам нужно собрать фрагмент запроса из логики или переменных приложения. Нет необходимости использовать этот интерфейс, когда вы можете просто указать полный SQL-запрос в строке. * SQL уже является доменным языком. * –

+0

@Bill Karwin, но разбор SQL занимает время, а не Zend_Db_Select с расширением PDO gona save recourse ?? –

1

http://framework.zend.com/manual/en/zend.db.adapter.html

см fetchOne

$this->setTableName('visitors'); 
$select = $this->select() 
       ->from('visitors') 
       ->columns(array('total' => new Zend_Db_Expr('COUNT(*)'))) 
       ->where('...'); 
$count = $this->getAdapter()->fetchOne($select); 
+0

Получает ли это все данные, а затем дает счет или просто возвращает счет? – Owen

4
$count = $this->select()->from($this,'COUNT(*)')->query()->fetchColumn(); 
+0

Это выглядит интересно, добавлю что-то вроде count (mycol) в бит query()? – Owen

+0

ничего не нужно, вы можете заменить $ this на «посетителей», если хотите. –

+0

ОК, но как добавить условие WHERE, это запрос ('WHERE ...')? – Owen

-1

Если вы хотите, вы можете просто принести весь набор строк с fetchAll() или эквивалент, а затем использовать count():

$rows = $table->fetchAll(); 
$count = count($rowset); 

Это, вероятно, только самое лучшее решение, если вы будете делать что-то еще с этим строк, хотя ,

+1

это хуже. извлекать все из таблицы только для подсчета. если в таблице записаны записи 1kk? ^) – SMka

+0

Я согласен, что это плохое решение, если вы * только * подсчитываете записи в таблице - вот почему я сказал: «Это, вероятно, только лучшее решение, если вы будете делать что-то еще с этим набором строк». Просто попробуйте показать, что вы можете использовать 'count()' с Zend_Db_Table_Rowset. :) –

+1

если только счетчик строк - путь два: '$ count = $ rowset-> count();' :) – SMka

0

здесь я идти

public function fetchCount($data) 
{ 
    $sql = "SELECT COUNT(*) AS count FROM table WHERE field = ".$data; 

    $count = $this->db->fetchOne($sql, array('count')); 

    return $count; 
} 
Смежные вопросы