2013-06-13 4 views
9

Я пытаюсь получить общее количество строк, найденных для конкретного запроса, когда применяется LIMIT. Я успешно нашел ответ в PHP/MySQL, но я не могу преобразовать логику в Zend/Doctrine. Я работаю с Doctrine 2.3/Zend 1.12.Doctrine Query, чтобы найти общее количество результатов в MySQL с LIMIT

Я не хочу использовать два различных запросов, чтобы найти результат:

PHP КОД:

<?php 
$con = mysql_connect('localhost', 'root', ''); 
if (!$con) 
    { 
    die('Could not connect: ' . mysql_error()); 
    } 
mysql_select_db("myproject", $con); 

$sql = "SELECT SQL_CALC_FOUND_ROWS * FROM `user` WHERE `user_country`='us' LIMIT 10"; 
$result = mysql_query($sql); 
$sql = "SELECT FOUND_ROWS() AS `found_rows`;"; 
$rows = mysql_query($sql); 
$rows = mysql_fetch_assoc($rows); 
$total_rows = $rows['found_rows']; 
echo $total_rows; 
?> 

Также я попробовал Следуя MySQL Query:

Try с Союзом:

SELECT COUNT(*) FROM `user` WHERE `user_country` = 'US' 
UNION SELECT `user_id` FROM `user` WHERE `user_country` = 'US' LIMIT 10; 

Try с Select:

SELECT *,(SELECT COUNT(*) from `user` where `user_country`='US') as Count 
from `user` where `user_country`='US' LIMIT 10; 

И выше попытка занимает много времени для графа():

Может кто-нибудь помочь мне найти решение ..

Доктрина:

$qry = $this->manager()->createQueryBuilder() 
        ->from($this->entity, 'e') 
        ->select('e'); 
$qry->where('e.user_country = :country'); 
$qry->setParameter('country', 'us'); 
$limit='10'; 
$qry->setMaxResults($limit); 

Как я могу преобразовать вышеприведенный код доктрины как-то вроде вышеуказанного результата PHP-запроса? Является ли это возможным?

ответ

5

Существует функция разбиения на страницы, которая встроена в 2.2, и делает что-то подобное тому, что вы ищете:

http://docs.doctrine-project.org/en/latest/tutorials/pagination.html

Но я не верю, что это использует SQL_CALC_FOUND_ROWS: он делает два (или три, в зависимости от того, как вы его настраиваете) отдельные запросы для получения результатов, и это часто правильный путь.

Если вы действительно настаиваете на использовании функции MySQL, я думаю, вам нужно использовать raw SQL и отображение набора результатов. Вот пример:

Count of rows in Doctrine 2


На совершенно отдельной ноте, тест ли SQL_CALC_FOUND_ROWS на самом деле стоит использовать для вашего конкретного запроса. Граф хорошо оптимизирован в MySQL для запросов, подобных тому, который вы делаете.Смотрите этот вопрос, в частности:

Which is fastest? SELECT SQL_CALC_FOUND_ROWS FROM `table`, or SELECT COUNT(*)

0

Может быть, это может быть поможет вам

Doctrine::getTable('TableName')->createQuery('t') 
->where('Your Condition') ->execute() ->rowCount(); 

ИЛИ

Doctrine::getTable('TableName')->createQuery('t') 
->where('Your Condition') ->count(); 

я предпочел второй

Вы можете сделать

$q = Doctrine_Query::create() 
     ->select('ss.*') 
     ->from('SalarySurvey ss') 
     ->where('ss.user_id=?', $user_id) 
     ->groupBy('created_at') 
     ->execute(); 
$totalData = $q->count(); 

Для LIMIT

$q = Doctrine_Query::create() 
     ->select('u.username, p.phonenumber') 
     ->from('User u') 
     ->leftJoin('u.Phonenumbers p') 
     ->limit(20); 

echo $q->getSqlQuery(); 

Выход этого запроса, как это ---

SELECT 
    u.id AS u__id, 
    u.username AS u__username, 
    p.id AS p__id, 
    p.phonenumber AS p__phonenumber 
FROM user u 
    LEFT JOIN phonenumber p 
     ON u.id = p.user_id 
LIMIT 20 

Для получения более подробной информации смотрите на check here

+0

насчет лимита в запросе? – TomPHP

+0

Мой вопрос: как я могу получить общее количество записей, а также ограничить в одном запросе .. Ваш запрос дает мне LIMIT. Я хочу один запрос, который сообщает общее количество счетчиков и ограничивает вывод. Как я упоминал выше .. либо это может быть два запроса, но он не должен запускать тот же запрос снова и снова .. – TomPHP

+1

do u want count() и limit() в одном запросе? – Napster

1

Вы можете получить счет, обратившись к EntityPersister::count(array $criteria)

Например:

$count = $doctrineEntityManager 
     ->getUnitOfWork() 
     ->getEntityPersister(Entity::class) 
     ->count($criteria); 
Смежные вопросы