2013-06-13 6 views
9
zu finden

Ich versuche, die Gesamtzahl der Zeilen für bestimmte Abfrage abgerufen, wenn LIMIT angewendet wird. Ich habe die Antwort in PHP/MySQL gefunden, aber ich kann die Logik in Zend/Doctrine nicht umsetzen. Ich arbeite mit Doctrine 2.3/Zend 1.12.Doctrine Abfrage, um die Gesamtzahl der Ergebnisse in MySQL mit LIMIT

Ich möchte nicht zwei verschiedene Abfragen verwenden, um das Ergebnis zu finden:

PHP CODE:

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

Auch habe ich versucht, das Folgende in MySQL Query:

Try mit Union:

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

Versuchen mit Select:

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

Sowohl die Above try Zeit für den Grafen nimmt():

Kann jemand mir helfen, die Lösung zu finden ..

Lehre:

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

Wie kann ich den oben genannten Doktrin-Code etwas wie die obige PHP-Ergebnis-Abfrage konvertieren? Ist es möglich?

Antwort

5

Es gibt eine Paginierung Funktion, die in 2.2 eingebaut ist, und tut etwas Ähnliches, was Sie suchen:

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

Aber ich glaube es nicht SQL_CALC_FOUND_ROWS verwendet: es tut zwei (oder drei, je nachdem, wie Sie es konfigurieren) separate Abfragen, um die Ergebnisse zu erhalten, und das ist häufig der richtige Weg, um fortzufahren.

Wenn Sie wirklich darauf bestehen, die MySQL-Funktion zu verwenden, denke ich, dass Sie Raw SQL und eine Ergebnismengenzuordnung verwenden müssen. Hier ein Beispiel:

Count of rows in Doctrine 2


Auf einem völlig separaten Hinweis, Test, ob SQL_CALC_FOUND_ROWS tatsächlich wert ist für Ihre Abfrage verwenden. Count ist in MySQL für Abfragen wie die, die Sie gerade ausführen, gut optimiert.Sehen Sie diese Frage insbesondere:

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

0

dies können Sie

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

werden helfen ODER

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

I ONE SECOND

Sie tun bevorzugt sein kann so,

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

Für die LIMIT

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

echo $q->getSqlQuery(); 

Der Ausgang dieser Abfrage wie folgt ist ---

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 

Weitere Details sehen check here

+0

Was über die Grenze in Abfrage? – TomPHP

+0

Meine Frage ist, wie kann ich die Gesamtzahl der Datensätze abrufen und auch in der gleichen Abfrage begrenzen. Ihre Abfrage gibt mir entweder LIMIT. Ich möchte eine einzelne Abfrage, die die Gesamtzahl der Anzahl und begrenzen Sie die Ausgabe. Wie ich oben erwähnt habe. Entweder es könnte zwei Abfrage sein, aber es sollte nicht die gleiche Abfrage immer wieder ausgeführt werden. – TomPHP

+1

wollen Sie count() und limit() in einer einzigen Abfrage? – Napster

1

Sie können Zähle durch Zugriff auf EntityPersister::count(array $criteria)

Zum Beispiel:

$count = $doctrineEntityManager 
     ->getUnitOfWork() 
     ->getEntityPersister(Entity::class) 
     ->count($criteria); 
Verwandte Themen