6
votes

Comptez les lignes dans MySQL avec le contenu de la ligne réelle

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: xxx < P> Ce qui me donne une seule rangée de résultat avec le compte (37 781). Je peux obtenir les données de ligne réelles telles que ceci: xxx

qui affiche les 37 781 lignes réelles. Mais quand j'essaie de les combiner, comme ceci: xxx

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 .

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?


0 commentaires

4 Réponses :


3
votes

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%'


1 commentaires

Merci Barmar! J'ai testé cela et ça fait exactement ce que je veux.



7
votes

Vous pouvez utiliser une jointure croisée. La sous-requête obtiendra le compte pour tous les noms prénoms , puis il inclura cette valeur dans chaque ligne: xxx

voir SQL Fiddle avec Demo


3 commentaires

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! :)



1
votes

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%';


2 commentaires

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!



2
votes

La jointure croisée n'est pas la solution efficace, la meilleure façon d'utiliser un inline comme la structure suivante: xxx

J'ai testé les deux approches avec 50k Enregistrements dans la base de données, et cette approche est presque 2x plus rapide.


1 commentaires

Ouais, ce faisant de cette façon est rapide - la vitesse est identique à ne pas faire le compte (*) du tout. Agréable :-)