J'essaye donc d'obtenir le nombre de pids distincts sur une requête, mais la valeur renvoyée est fausse.
C'est ce que j'essaye de faire:
$ad->getcodes()->groupby('pid')->distinct()->count()
ce qui renvoie la valeur "2", tandis que la valeur qu'il doit renvoyer doit être "1".
Pour contourner le problème, je fais ceci:
count($ad->getcodes()->groupby('pid')->distinct()->get())
ce qui fonctionne bien et renvoie "1"
Existe-t-il une règle où count et distinct ne peuvent pas être sur la même requête? Je trouve que la solution de contournement est "lourde", je voudrais faire fonctionner la requête d'origine :(
pid
colonne, donc si vous avez dans votre table 2 enregistrements - un avec pid 1, le second avec pid 2, count devrait renvoyer 2.$count = DB::table('tablename')->count(DB::raw('DISTINCT pid'));
pouvez également faire:DB::table('tablename')->distinct('pid')->count('pid');
Réponses:
Ce qui suit devrait fonctionner
la source
groupBy
fait l'affaire.count()
semble désactiver ou supprimer le fichierdistinct()
. UtilisezgroupBy()
comme décrit tout au long de la question. Edit: Je trouve que mêmegroupBy()
fournit un différentcount()
par rapport àget()
suivi en comptant le tableau résultant.distinct()
fonction ne prend aucun argument. Vous pouvez le changer$ad->getcodes()->distinct()->count('pid');
avec le même résultat.Une réponse plus générique qui m'aurait fait gagner du temps, et j'espère que d'autres:
Ne fonctionne pas (renvoie le nombre de toutes les lignes):
Le correctif:
la source
Quelqu'un d'autre est tombé sur ce post et ne trouve pas les autres suggestions pour fonctionner?
En fonction de la requête spécifique, une approche différente peut être nécessaire. Dans mon cas, je devais soit compter les résultats d'un
GROUP BY
, par exempleou utilisez
COUNT(DISTINCT b)
:Après quelques intrigues, j'ai réalisé qu'il n'y avait pas de fonction Laravel intégrée pour l'un ou l'autre. La solution la plus simple était donc d'utiliser l'utilisation
DB::raw
avec lacount
méthode.N'oubliez pas de ne pas utiliser
groupBy
avant d'appelercount
. Vous pouvez postulergroupBy
plus tard, si vous en avez besoin pour obtenir des lignes.la source
$books = Book::where(...)->count(...)
->count(DB::raw('DISTINCT b'))
générer la même requête SQL que->distinct()->count('b')
J'ai eu un problème similaire et j'ai trouvé un moyen de le contourner.
Le problème est la façon dont le générateur de requêtes de Laravel gère les agrégats. Il prend le premier résultat renvoyé, puis renvoie la valeur «agrégée». C'est généralement bien, mais lorsque vous combinez count avec groupBy, vous renvoyez un nombre par élément groupé. Ainsi, l'agrégat de la première ligne est juste un décompte du premier groupe (donc quelque chose de faible comme 1 ou 2 est probable).
Le décompte de Laravel est donc sorti, mais j'ai combiné le générateur de requêtes Laravel avec du SQL brut pour obtenir un décompte précis de mes résultats groupés.
Pour votre exemple, je m'attends à ce que ce qui suit fonctionne (et vous permette d'éviter le get):
Si vous voulez vous assurer de ne pas perdre de temps à sélectionner toutes les colonnes, vous pouvez éviter cela lors de la création de votre requête:
la source
J'ai rencontré le même problème.
Si vous installez la barre de débogage laravel, vous pouvez voir les requêtes et voir souvent le problème
changer en
Vous devez définir les valeurs à renvoyer comme distinctes. Si vous ne définissez pas les champs de sélection, toutes les colonnes de la base de données seront renvoyées et toutes seront uniques. Définissez donc la requête sur distinct et ne sélectionnez que les colonnes qui constituent votre valeur `` distincte '' que vous voudrez peut-être en ajouter.
->select('pid','date')
pour obtenir toutes les valeurs uniques d'un utilisateur en une journéela source
Vous pouvez utiliser la méthode suivante pour obtenir les données uniques selon vos besoins, comme suit,
J'espère que cela fonctionnera.
la source
Cela ne fonctionnerait-il pas?
Voir ici pour discussion.
la source
get()
appel exécutera la requête et retournera les résultats de la base de données, puis lescount()
exécute sur la collection.N'oubliez pas que le groupe par est facultatif, cela devrait fonctionner dans la plupart des cas lorsque vous souhaitez qu'un groupe de comptage par exclure les valeurs de sélection en double, addSelect est une méthode d'instance de querybuilder.
la source
Distinct ne prend pas d'arguments car il ajoute DISTINCT dans votre requête SQL, cependant, vous pouvez avoir besoin de définir le nom de colonne avec lequel vous souhaitez sélectionner distinct. Ainsi, si vous avez
Flight->select('project_id')->distinct()->get()
est équivalent àSELECT DISTINCT 'project_id' FROM flights
et vous pouvez maintenant ajouter d'autres modificateurs comme count () ou même des requêtes éloquentes brutes.la source
Sur la base de la documentation Laravel pour les requêtes brutes, j'ai pu obtenir le décompte d'un champ de sélection pour travailler avec ce code dans le modèle de produit.
Cette façade a fonctionné pour obtenir le même résultat dans le contrôleur:
Le vidage résultant pour les deux requêtes était le suivant:
la source
Cela fonctionnait pour moi alors essayez ceci: $ ad-> getcodes () -> distinct ('pid') -> count ()
la source
essaye ça
la source