57 votes

D'obtenir le nombre de lignes avec un GROUPE PAR requête

J'ai une requête à l'effet de

SELECT t3.id, a,bunch,of,other,stuff FROM t1, t2, t3 
WHERE (associate t1,t2, and t3 with each other) 
GROUP BY t3.id 
LIMIT 10,20

Je veux savoir à de nombreuses lignes de totaux cette requête retourne sans LIMITE (pour que je puisse afficher les informations de pagination).

Normalement, je voudrais utiliser cette requête:

SELECT COUNT(t3.id) FROM t1, t2, t3 
WHERE (associate t1,t2, and t3 with each other) 
GROUP BY t3.id

Cependant, le GROUPE EN modifie le sens du COMTE, et au lieu de cela, je reçois un ensemble de lignes représentant le nombre de t3.les valeurs d'id dans chaque groupe.

Est-il possible d'obtenir un nombre pour le nombre total de lignes lorsque j'utilise un GROUPE? J'aimerais éviter d'avoir à exécuter l'intégralité de la requête et de simplement compter le nombre de lignes, depuis que j'ai seulement besoin d'un sous-ensemble de lignes car les valeurs sont paginé. Je suis de l'utilisation de MySQL 5, mais je pense que c'est assez générique.

53voto

Sylvain Points 740

Il y a une belle solution dans MySQL.

Ajoutez le mot-clé SQL_CALC_FOUND_ROWS à droite après le mot-clé, SÉLECTIONNEZ :

SELECT SQL_CALC_FOUND_ROWS t3.id, a,bunch,of,other,stuff FROM t1, t2, t3 
WHERE (associate t1,t2, and t3 with each other) 
GROUP BY t3.id 
LIMIT 10,20

Après cela, exécutez une autre requête avec la fonction FOUND_ROWS() :

SELECT FOUND_ROWS();

Il doit retourner le nombre de lignes sans la clause LIMIT.

La caisse de cette page pour plus d'informations : http://dev.mysql.com/doc/refman/5.0/en/information-functions.html#function_found-rows

50voto

Tom H. Points 23783

Ce sont les "tas d'autres trucs" tous les agrégats? Je suppose donc, puisque votre GROUPE EN a seulement t3.id. Si c'est le cas, alors cela devrait fonctionner:

SELECT
     COUNT(DISTINCT t3.id)
FROM...

L'autre option est bien sûr:

SELECT
     COUNT(*)
FROM
     (
     <Your query here>
     ) AS SQ

Je n'utilise pas MySQL, donc je ne sais pas si ces requêtes vont y travailler ou pas.

12voto

Silver Moon Points 508

À l'aide de sous-requêtes :

SELECT COUNT(*) FROM    
(
SELECT t3.id, a,bunch,of,other,stuff FROM t1, t2, t3 
WHERE (associate t1,t2, and t3 with each other) 
GROUP BY t3.id 
)    
as temp;

donc temp contient le nombre de lignes.

11voto

Bill Karwin Points 204877

Vous utilisez MySQL, vous pouvez utiliser leur fonction de faire exactement cela.

SELECT SQL_CALC_FOUND_ROWS t3.id, a,bunch,of,other,stuff 
FROM t1, t2, t3 
WHERE (associate t1,t2, and t3 with each other) 
GROUP BY t3.id 
LIMIT 10,20;

SELECT FOUND_ROWS(); -- for most recent query

http://dev.mysql.com/doc/refman/5.0/en/information-functions.html#function_found-rows

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X