DB->count() pour retourner une valeur différente de count(DB->get())
J'ai le plus simple des requêtes que je suis en train de lancer
DB::table('user_visits')->groupBy('user_id')->count();
Mais il est de retour le mauvais numéro, 8.
Si je le modifier:
count(DB::table('user_visits')->groupBy('user_id')->get());
Puis il renvoie le nombre exact, 34. Pourquoi ne sont-ils pas la même valeur?
Voici mon tableau de structure
user_visits( user_id, date_visited, num_clicks )
OriginalL'auteur andrewtweber | 2014-06-10
Vous devez vous connecter pour publier un commentaire.
Une note sur le débogage
Les requêtes générées par ces deux approches sont totalement différentes, et c'est pourquoi ce qui se passe pour vous. Chaque fois que vous l'expérience de DB questions, c'est toujours une bonne idée de regarder la requête sous-jacente de journal, de sorte que vous pouvez voir ce qui est exécuté par:
qui permet d'imprimer le journal de la requête, si vous le faites à droite après la récidive des recherches, vous pouvez simplement aller à la fin du journal pour votre dernière requête (c'est à dire si vous l'avez placé après la seconde recherche, de la dernière requête dans le journal serait votre enveloppé compteur, et la dernière requête serait le comte de la méthode).
Votre problème spécifique
De toute façon, pour expliquer votre problème spécifique. Les deux requêtes sont générées seront comme
Ce sera de retour le nombre d'entrées dans chaque groupe. Ce que mysql est fait, c'est le regroupement de toutes les lignes par colonne user_id, puis en revenant d'une ligne par groupe avec les comtes. Si nous avons ajouté la "user_id" dans les colonnes de la sélection et de l'exécution de la requête manuellement sur votre base de données, vous pourriez voir quelque chose comme cela comme un résultat
Votre deuxième question est différente
Ce faire, il vous suffit de sélectionner toutes les entrées, de les regrouper et de les renvoyer. Ce qu'il en résulte, est une ligne par utilisateur id étant retourné, et que la ligne contient toutes les informations de l'UNE des entrées pour que user_id (peut-être la première entrée de l'utilisateur, il pourrait être le dernier, il pourrait être aléatoire, il n'a pas d'importance).
Votre
count()
compte ensuite le nombre de lignes qui ont été retournés, ce qui sera le nombre de unique user_ids.De sorte que votre première requête est en comptant le nombre de user_ids par groupe sont là (et laravel sera de retour le premier enregistrement lorsque vous essayez d'imprimer le résultat, ce qui entraîne l'affichage du nombre d'entrées pour le premier user_id dans le jeu de résultats), et votre deuxième question (en plus de la fonction de comptage appliquée) est de retour en combien de groupes ont été trouvés (j'.e nombre de unique user_ids).
À l'aide de ma table à partir de ci-dessus, pour illustrer ce propos...
Requête 1: retourne "8", comme c'est le comte, pour la première entrée dans le jeu de résultats
Requête 2: retourne "3", comme c'est le comte, pour le nombre de lignes dans le jeu de résultats
Veux le nombre correct, sans le chargement de toutes les données?
Si vous voulez que le résultat soit correct conformément à votre deuxième question, mais que vous voulez léger, moins le réseau lourd entier de réponse de la requête 1, vous pouvez le faire:
qui se traduit par:
J'espère que tout fait sens, c'est un peu déroutant pour obtenir votre tête autour de moi, je suis sûr que
DB::table('user_invites')->select('user_id')->distinct()->count()
pas de travail?oui, qui a également travaillé
Merci Lee, qui est très complet. J'ai suivi votre explication parfaitement, je suis vraiment perplexe pourquoi ils ont codé à se comporter de cette façon. Il y a encore 34 lignes renvoyées, et je pense que c'est vraiment bizarre que
->count()
renvoie laCOUNT()
valeur de la première ligne, plutôt que le nombre de lignes. Pour obtenir de l'ex-je en droit d'attendre pour ce faire->select(DB::raw('COUNT(1) AS total'))->first()
au lieu de cela... oh bien.Si vous considérez que l'ordre dans lequel vous créez la requête n'a pas d'importance, il fait plus de sens. Vous auriez pu écrire
DB::table('user_visits')->count()->groupBy('user_id');
et puis ce serait un peu plus claire de ce qu'il fait. Je ne suis pas un grand fan de la Laravel requête constructeur; certainement a une certaine étrangeté.quel grand aswer!
OriginalL'auteur Lee
Vous pouvez essayer ce parce que le
group by
instruction est exécutée après lacount
(Bug #26209):Un autre mySql répondre ici.
OriginalL'auteur The Alpha