Comment obtenir le nombre total de lignes d'un GROUPE PAR requête?

De l'AOP manuel:

PDOStatement::rowCount() retourne le
nombre de lignes affectées par la dernière
DELETE, INSERT ou UPDATE déclaration
exécuté par le correspondant
Objet PDOStatement.

Si la dernière instruction SQL exécutée par
l'associé était un PDOStatement
SÉLECTIONNEZ déclaration, certaines bases de données
retourne le nombre de lignes retournées par
cette déclaration
. Cependant, ce
le comportement est pas garantie pour tous les
les bases de données
et ne doit pas être invoqué
pour les applications portables.

J'ai constaté que très récemment. J'avais juste changé ma db couche d'abstraction pour ne pas utiliser SELECT COUNT(1) ... plus, parce que juste quering les lignes réelles et puis en comptant le résultat serait beaucoup plus efficace. Et maintenant AOP ne prend pas en charge le!?

Je n'utilise pas PDO pour MySQL et PgSQL, mais je le fais pour SQLite. Est-il un moyen (sans changer complètement le dbal retour) pour compter les lignes comme ceci en PDO? Dans MySQL, ce serait quelque chose comme ceci:

$q = $db->query('SELECT a, b, c FROM tbl WHERE oele = 2 GROUP BY boele');
$rows = $q->num_rows;
//and now use $q to get actual data

Avec la MySQLi et PgSQL pilotes, c'est possible. Avec tous les PDO, il n'est pas!?

PS. Au départ, ma solution a été d'étendre la SQLResult->count méthode (le mien) pour remplacer SELECT ... FROM par SELECT COUNT(1) FROM et juste retour de ce nombre (très inefficace, mais seulement pour SQLite AOP). Ce n'est pas assez bon, parce que dans l'exemple de requête ci-dessus est un GROUP BY, qui changerait le sens de la COUNT(1).

  • Ceci a me piquer dans le passé aussi, mais il a toujours été de cette façon — il n'a pas changé tout d'un coup. Postgres vous donnera le comte, MySQL ne sera pas. Vous êtes en supposant que l'exécution de l'interrogation et de compter les résultats seraient plus efficaces, mais que faire si vous avez 10s de milliers de lignes?
  • MySQL vous donnera le comte. PHP est "native", SQLlite client aussi. Tout simplement pas PDO. Avec tous les pilotes.
  • Si vous avez besoin d'une solution à l'extérieur de l'AOP (si ce n'est pas de suport countRows), vous pouvez essayer quelque chose comme: "select SUM(1) que le comte de ... ", je sais que ça fonctionne avec mySQL, il est juste d'ajouter de 1 pour chaque ligne retournée dans la requête (n'ai pas testé cela dans sqlLite), en fin de compte la valeur de count = count(*).
InformationsquelleAutor Rudie | 2011-05-18