2013-06-13 9 views
9

Próbuję pobrać całkowitą liczbę wierszy znalezionych dla konkretnego zapytania po zastosowaniu LIMIT. Z powodzeniem znalazłem odpowiedź w PHP/MySQL, ale nie jestem w stanie przekonwertować logiki w Zend/Doctrine. Pracuję z Doctrine 2.3/Zend 1.12.Doctrine Query, aby znaleźć łączną liczbę wyników w MySQL z LIMITem

nie chcę korzystać z dwóch różnych zapytań znaleźć wynik:

kod 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; 
?> 

także Próbowałem następujących w MySQL Query:

Try z Union:

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

spróbuj Wybierz:

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

Zarówno Przede try Potrzeba czasu, count():

Czy ktoś pomoże mi znaleźć rozwiązanie ..

Doctrine:

$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); 

Jak mogę przekonwertować powyższy kod doktryny na coś takiego jak powyższe zapytanie o wynik PHP? Czy to możliwe?

Odpowiedz

5

Jest cechą paginacja, który jest wbudowany w 2.2, i robi coś podobnego do tego, czego szuka:

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

Ale ja w to nie wierzę wykorzystuje SQL_CALC_FOUND_ROWS: robi dwa (lub trzy, w zależności od konfiguracji) oddzielne zapytania, aby uzyskać wyniki, i często jest to właściwy sposób postępowania.

Jeśli naprawdę nalegasz na używanie funkcji MySQL, myślę, że musisz użyć surowego SQL i mapowania zestawu wyników. Oto przykład:

Count of rows in Doctrine 2


na zupełnie odrębnej notatce, test czy SQL_CALC_FOUND_ROWS jest rzeczywiście warto stosować dla danego zapytania. Count jest zoptymalizowany w MySQL dla zapytań takich jak ten, który robisz.Patrz na to pytanie w szczególności:

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

0

może być to można pomóc

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

LUB

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

wolałem drugi

Można zrobić tak,

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

Dla LIMIT

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

echo $q->getSqlQuery(); 

wyjściu tego zapytania jest tak ---

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 

Więcej szczegółów spojrzeć na check here

+0

Co limitu w zapytaniu? – TomPHP

+0

Moje pytanie brzmi: w jaki sposób mogę pobrać całkowitą liczbę rekordów, a także ograniczyć w tym samym zapytaniu. Zapytanie daje mi LIMIT. Chcę pojedynczej kwerendy, która mówi całkowitą liczbę count i ograniczyć wyjście. Jak wspomniałem powyżej .. może to być dwie kwerendy, ale nie powinno to być ponowne uruchamianie tego samego zapytania. – TomPHP

+1

Czy chcesz count() i limit() w jednym kwerendzie? – Napster

1

Można zliczaj, uzyskując dostęp do EntityPersister::count(array $criteria)

Na przykład:

$count = $doctrineEntityManager 
     ->getUnitOfWork() 
     ->getEntityPersister(Entity::class) 
     ->count($criteria); 
Powiązane problemy