Y a-t-il un moyen de faire une seule instruction SQL qui renvoie les lignes sélectionnées avec le nombre de lignes de résultat?
Je peux faire ceci: p> qui affiche les 37 781 lignes réelles. Mais quand j'essaie de les combiner, comme ceci: p> Je reçois une seule ligne avec la première ligne qui correspond à la requête et le nombre total d'enregistrements correspondant à la requête . P> Ce que j'aimerais voir, c'est deux colonnes avec 37 781 rangées. La première colonne doit contenir le prénom de chaque ligne et la deuxième colonne doit contenir le nombre '37, 781 'pour chaque ligne. Y a-t-il un moyen d'écrire la requête pour accomplir cela? P> p>
4 Réponses :
Vous pouvez vous joindre à une sous-requête:
SELECT firstname, ct FROM BigTable JOIN (SELECT COUNT(*) ct FROM BigTable WHERE firstname LIKE 'a%') x ON (1 = 1) WHERE firstname LIKE 'a%'
Merci Barmar! J'ai testé cela et ça fait exactement ce que je veux.
Vous pouvez utiliser une jointure croisée. La sous-requête obtiendra le compte pour tous les noms voir SQL Fiddle avec Demo P> P> prénoms code>, puis il inclura cette valeur dans chaque ligne:
Merci, ça a fonctionné parfaitement. La réponse de Barmar a également fonctionné, mais cela est légèrement plus rapide (environ 5,75 secondes) que l'autre approche (environ 6,5 secondes).
SQL Fiddle est génial. Je n'ai pas entendu parler de cela. Merci pour le conseil.
@Brianmoore SQL Fiddle a été écrit par un utilisateur Stackoverflow! :)
Je me sens comme si c'était le cas des anciennes versions de MySQL, mais cela ne fonctionne pas dans mes tests.
mais selon le manuel, http://dev.mysql.com/doc/refman/5.1/fr/group-by-fonctions. HTML # Function_Count Compte tenu de ce nombre (*) est un groupe par fonction et regroupe naturellement toutes les lignes ensemble, lorsqu'un groupe par instruction n'est pas joint, je ne peux que voir la solution à cela étant soit multiples déclarations, ou une sous-requête. Je suggérerais d'exécuter les 2 requêtes séparément, si vous le pouvez, mais si ce n'est pas possible, essayez: P>
SELECT firstname, total FROM BigTable, ( SELECT COUNT(*) AS total FROM BigTable ) AS dummy WHERE firstname LIKE 'a%';
Ceci est proche de ce que je recherche, bien que dans la deuxième colonne, je reçois le nombre total d'enregistrements dans le tableau, au lieu du total correspondant à la recherche.
J'ai ajouté le "où prénom comme" A% "" à la sous-requête et maintenant, il renvoie la réponse correcte. L'heure d'exécution est très similaire à la réponse de Bluefeet, environ 6,1 secondes lors de la course à plusieurs reprises. Merci!
La jointure croisée n'est pas la solution efficace, la meilleure façon d'utiliser un J'ai testé les deux approches avec 50k Enregistrements dans la base de données, et cette approche est presque inline code> comme la structure suivante:
Ouais, ce faisant de cette façon est rapide - la vitesse est identique à ne pas faire le compte (*) du tout. Agréable :-)