2008-12-13 7 views
54

J'ai une requête à l'effet deObtenir le nombre de lignes avec une requête GROUP BY

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 à plusieurs lignes au total cette requête retournerait sans LIMIT (je peux afficher des informations de pagination).

Normalement, j'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 GROUP BY change le sens du comte, et au lieu que j'obtenir un ensemble de lignes représentant le nombre de valeurs de t3.id uniques dans chaque groupe .

Existe-t-il un moyen d'obtenir un compte pour le nombre total de lignes lorsque j'utilise un GROUP BY? Je voudrais éviter d'avoir à exécuter la requête entière et à compter le nombre de lignes, car je n'ai besoin que d'un sous-ensemble de lignes car les valeurs sont paginées. J'utilise MySQL 5, mais je pense que c'est assez générique.

+0

[Utilisez les sous-requêtes pour compter 50x plus rapidement.] (Https: // www.Avec l'avertissement que je n'ai pas mesuré les appels moi-même, cet article m'a déconnecté de la solution: http: //www.periscopedata.com/blog/use-subqueries-to-count-distinct-50x-faster.html – bishop

Répondre

53

Il y a une bonne solution dans MySQL.

Ajouter le SQL_CALC_FOUND_ROWS mot-clé à droite après le mot-clé SELECT:

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

Elle doit retourner le nombre de lignes sans Clause LIMIT

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

+3

.mysqlperformanceblog.com/2007/08/28/à-sql_calc_found_rows-or-not-to-sql_calc_found_rows/ –

+0

Plutôt que d'exécuter plusieurs requêtes s'il vous plaît http://stackoverflow.com/a/364838/631652 pour la réponse de Tom. – Parixit

50

sont les « tas d'autres choses » tous les agrégats? Je le suppose puisque votre GROUP BY n'a que t3.id. Si tel 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 MySQL, donc je ne sais pas si ces requêtes vont y travailler ou ne pas.

+2

Dans MySQL, cela causera un bug, mais cela pourrait être une bonne solution si vous ajoutez un alias pour la table générée. Sinon, vous obtiendrez l'erreur: "Chaque table dérivée doit avoir son propre alias". Assurez-vous donc d'écrire quelque chose comme: Sélectionnez count (*) from (votre requête) comme résultatTable – Kennethvr

+0

Merci pour le heads-up. J'ai fait l'édition. –

+5

fonctionne en MySQL pour moi. – quano

12

Utilisation de requêtes sous:

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; 

si température contient le nombre de lignes.

1

Tous les ans donnés exécuteront la requête, puis trouveront le nombre. Distinct est nettement plus lent que le groupe sur un grand ensemble de données.

La meilleure façon de trouver le nombre de groupe en est inférieure à

SELECT 
    sum(1) as counttotal 
FROM (
    Your query with group by operator 
) as T 

Ceci trouvera le compte lors du calcul de groupe par.

Questions connexes