2013-06-13 11 views
9

Sto cercando di recuperare il numero totale di righe trovate per query specifiche quando viene applicato LIMIT. Ho trovato la risposta con successo in PHP/MySQL, ma non sono in grado di convertire la logica in Zend/Doctrine. Sto lavorando con Doctrine 2.3/Zend 1.12.Query di Doctrine per trovare il numero totale di risultati in MySQL con LIMIT

non voglio utilizzare due query diverse per trovare il risultato:

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

Inoltre ho provato quanto segue in MySQL Query:

Try con l'unione:

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

Prova con Seleziona:

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

Sia la prova Sopra vuole tempo per Count():

qualcuno può aiutarmi a trovare la soluzione ..

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

Come posso convertire il codice della dottrina sopra qualche cosa come il risultato PHP di cui sopra? È possibile?

risposta

5

C'è una funzione di impaginazione, che è costruito nella 2.2, e fa qualcosa di simile a quello che stai cercando:

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

Ma io non ci credo utilizza SQL_CALC_FOUND_ROWS: lo fa due (o tre, a seconda di come lo si configura) separare le query per ottenere i risultati, e spesso è il modo corretto di procedere.

Se si vuole davvero utilizzare la funzione MySQL, penso che sia necessario utilizzare SQL raw e una mappatura dei set di risultati. Ecco un esempio:

Count of rows in Doctrine 2


Su una nota completamente separato, verificare se SQL_CALC_FOUND_ROWS è in realtà vale la pena utilizzare per la query particolare. Count è ottimizzato in MySQL per query come quella che stai facendo.Vedere questa domanda in particolare:

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

0

Può essere questo può essere aiutare a

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

O

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

ho preferito seconda

Si può fare così,

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

Per la LIMIT

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

echo $q->getSqlQuery(); 

L'uscita di questa query è come questo ---

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 

Per maggiori dettagli un'occhiata a check here

+0

cosa circa il limite nella query? – TomPHP

+0

La mia domanda è come posso recuperare il conteggio totale dei record e anche limitare nella stessa query .. La tua query mi dà LIMIT. Voglio una singola query che indica il numero totale di conteggi e limita l'output. Come accennato in precedenza, potrebbe trattarsi di due query ma non dovrebbe essere eseguita la stessa query più e più volte .. – TomPHP

+1

vuoi count() e limit() in una singola query? – Napster

1

Puoi ottenere il conteggio accedendo a EntityPersister::count(array $criteria)

Ad esempio:

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