it-swarm.com.de

Laravel Eloquent - distinct () und count () funktionieren nicht richtig zusammen

Ich versuche also, die Anzahl der unterschiedlichen Pids in einer Abfrage abzurufen, aber der zurückgegebene Wert ist falsch.

Das versuche ich zu tun:

$ad->getcodes()->groupby('pid')->distinct()->count()

was den Wert "2" zurückgibt, der Wert, den es zurückgeben soll, sollte "1" sein.

Als Problemumgehung mache ich Folgendes:

count($ad->getcodes()->groupby('pid')->distinct()->get())

was funktioniert gut und gibt "1" zurück

Gibt es eine Regel, bei der Anzahl und Unterschied nicht in derselben Abfrage liegen können? Ich finde den Workaround irgendwie "schwer", ich möchte, dass die ursprüngliche Abfrage funktioniert :(

63
Inigo EC

Folgendes sollte funktionieren

$ad->getcodes()->distinct('pid')->count('pid');
72
Suresh Bala

Gibt es noch jemanden, der auf diesen Beitrag trifft und die anderen Vorschläge nicht findet, um zu arbeiten?

Abhängig von der spezifischen Abfrage kann ein anderer Ansatz erforderlich sein. In meinem Fall musste ich entweder die Ergebnisse eines GROUP BY zählen, z.

SELECT COUNT(*) FROM (SELECT * FROM a GROUP BY b)

oder benutze COUNT(DISTINCT b):

SELECT COUNT(DISTINCT b) FROM a

Nach einigem Rätseln stellte ich fest, dass es für diese auch keine eingebaute Laravel-Funktion gab. Die einfachste Lösung war also die Verwendung von DB::raw mit der count-Methode.

$count = $builder->count(DB::raw('DISTINCT b'));

Denken Sie daran, verwenden Sie nicht groupBy, bevor Sie count aufrufen. Sie können groupBy später anwenden, wenn Sie es zum Abrufen von Zeilen benötigen.

10
Zoon

Eine allgemeinere Antwort, die mir Zeit gespart hätte, und hoffentlich anderen:

Funktioniert nicht (gibt die Anzahl aller Zeilen zurück):

DB::table('users')
            ->select('first_name')
            ->distinct()
            ->count();

Die Reparatur:

DB::table('users')
            ->distinct()
            ->count('first_name');
8
Andrew

Ich hatte ein ähnliches Problem und fand einen Weg, es zu umgehen.

Das Problem ist die Art und Weise, wie Laravel Query Builder Aggregate verarbeitet. Es nimmt das erste zurückgegebene Ergebnis und gibt dann den Aggregatwert zurück. Dies ist normalerweise in Ordnung, aber wenn Sie count mit groupBy kombinieren, wird eine Anzahl pro gruppiertem Element zurückgegeben. Das Aggregat der ersten Zeile ist also nur eine Zählung der ersten Gruppe (etwas wie 1 oder 2 ist also wahrscheinlich).

Die Anzahl von Laravel ist also aus, aber ich habe den Laravel Query Builder mit etwas rohem SQL kombiniert, um eine genaue Zählung meiner gruppierten Ergebnisse zu erhalten.

Für Ihr Beispiel erwarte ich Folgendes sollte funktionieren (und lassen Sie das Get vermeiden):

$query = $ad->getcodes()->groupby('pid')->distinct();
$count = count(\DB::select($query->toSql(), $query->getBindings()));

Wenn Sie sicherstellen möchten, dass Sie keine Zeit mit der Auswahl aller Spalten verschwenden, können Sie dies beim Erstellen Ihrer Abfrage vermeiden:

 $query = $ad->select(DB::raw(1))->getcodes()->groupby('pid')->distinct();
3
Matt McDonald

Würde das nicht funktionieren?

$ad->getcodes()->distinct()->get(['pid'])->count();

hier zur Diskussion ..

1
JonnyFoley

Distinct akzeptiert keine Argumente, da es DISTINCT in Ihre SQL-Abfrage einfügt. Möglicherweise müssen Sie jedoch den Spaltennamen definieren, mit dem Sie eindeutig auswählen möchten. Wenn also Flight->select('project_id')->distinct()->get() gleichbedeutend mit SELECT DISTINCT 'project_id' FROM flights ist, können Sie jetzt weitere Modifikatoren wie count () oder sogar rohe eloquente Anfragen hinzufügen.

Ich bin auf das gleiche Problem gestoßen. 

Wenn Sie eine Laravel-Debugleiste installieren, können Sie die Abfragen sehen und oft das Problem sehen

$ad->getcodes()->groupby('pid')->distinct()->count()

ändern 

$ad->getcodes()->distinct()->select('pid')->count()

Sie müssen die Werte so einstellen, dass sie als eindeutig zurückgegeben werden. Wenn Sie die Auswahlfelder nicht festlegen, werden alle Spalten in der Datenbank zurückgegeben, und alle sind eindeutig. Setzen Sie die Abfrage also auf "different" und wählen Sie nur die Spalten aus, aus denen der "different" -Wert besteht, den Sie möglicherweise hinzufügen möchten. ->select('pid','date'), um alle eindeutigen Werte eines Benutzers an einem Tag abzurufen

0
Brett
$solution = $query->distinct()
            ->groupBy
            (
                [
                    'array',
                    'of',
                    'columns',
                ]
            )
            ->addSelect(
                [
                    'columns',
                    'from',
                    'the',
                    'groupby',
                ]
            )
            ->get();

Denken Sie daran, dass die Gruppe von optional ist. Dies sollte in den meisten Fällen funktionieren, wenn Sie möchten, dass eine Zählgruppe doppelte Auswahlwerte ausschließt.

0
Daniel Santos
DB::table('adverts')->distinct()->select('ad_advertiser')->get()
0
Gurpreet Singh