Ich versuche also, die Anzahl der unterschiedlichen Pids für eine Abfrage zu ermitteln, aber der zurückgegebene Wert ist falsch.
Das versuche ich zu tun:
$ad->getcodes()->groupby('pid')->distinct()->count()
Was den Wert "2" zurückgibt, während der Wert, den es zurückgeben soll, "1" sein sollte.
Um dieses Problem zu umgehen, mache ich Folgendes:
count($ad->getcodes()->groupby('pid')->distinct()->get())
was gut funktioniert und "1" zurückgibt
Gibt es eine Regel, nach der Anzahl und Unterscheidungskraft nicht in derselben Abfrage enthalten sein können? Ich finde die Problemumgehung "schwer", ich möchte, dass die ursprüngliche Abfrage funktioniert :(
pid
Spalte erhalten. Wenn Sie also in Ihrer Tabelle 2 Datensätze haben - einer mit PID 1, der zweite mit PID 2, sollte die Anzahl 2 zurückgeben.$count = DB::table('tablename')->count(DB::raw('DISTINCT pid'));
kann auch tun:DB::table('tablename')->distinct('pid')->count('pid');
Antworten:
Folgendes sollte funktionieren
quelle
groupBy
den Trick weglassen.count()
scheint das zu deaktivieren oder zu löschendistinct()
. Verwenden SiegroupBy()
wie in der Frage beschrieben. Bearbeiten: Ich finde sogar,groupBy()
dass es ein anderes gibtcount()
als dasget()
Zählen des resultierenden Arrays.distinct()
Funktion akzeptiert keine Argumente. Sie können es$ad->getcodes()->distinct()->count('pid');
mit dem gleichen Ergebnis ändern .Eine allgemeinere Antwort, die mir und hoffentlich anderen Zeit gespart hätte:
Funktioniert nicht (gibt die Anzahl aller Zeilen zurück):
Die Reparatur:
quelle
Ist noch jemand auf diesen Beitrag gestoßen und hat keine anderen Vorschläge gefunden, die funktionieren könnten?
Abhängig von der spezifischen Abfrage kann ein anderer Ansatz erforderlich sein. In meinem Fall musste ich entweder die Ergebnisse von a zählen
GROUP BY
, zoder verwenden
COUNT(DISTINCT b)
:Nach einigem Rätsel wurde mir klar, dass es für beide keine eingebaute Laravel-Funktion gab. Die einfachste Lösung war also die Verwendung
DB::raw
dercount
Methode.Denken Sie daran, nicht
groupBy
vor dem Anruf zu verwendencount
. Sie können sichgroupBy
später bewerben , wenn Sie es zum Abrufen von Zeilen benötigen.quelle
$books = Book::where(...)->count(...)
->count(DB::raw('DISTINCT b'))
Generieren Sie dieselbe SQL-Abfrage wie->distinct()->count('b')
Ich hatte ein ähnliches Problem und fand einen Weg, es zu umgehen.
Das Problem ist die Art und Weise, wie der Abfrage-Generator von Laravel mit Aggregaten umgeht. Es wird das erste zurückgegebene Ergebnis und dann der Gesamtwert zurückgegeben. Dies ist normalerweise in Ordnung, aber wenn Sie count mit groupBy kombinieren, geben Sie eine Anzahl pro gruppiertem Element zurück. Das Aggregat der ersten Zeile ist also nur eine Zählung der ersten Gruppe (also ist etwas Niedriges wie 1 oder 2 wahrscheinlich).
Die Anzahl von Laravel ist also abgelaufen, aber ich habe den Laravel-Abfrage-Generator mit etwas SQL kombiniert, um eine genaue Zählung meiner gruppierten Ergebnisse zu erhalten.
Für Ihr Beispiel erwarte ich, dass Folgendes funktionieren sollte (und Sie das Get vermeiden können):
Wenn Sie sicherstellen möchten, dass Sie keine Zeit mit der Auswahl aller Spalten verschwenden, können Sie dies beim Erstellen Ihrer Abfrage vermeiden:
quelle
Ich bin auf das gleiche Problem gestoßen.
Wenn Sie die Laravel-Debug-Leiste installieren, können Sie die Abfragen und häufig das Problem sehen
ändern
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 daher auf "Unterschiedlich" und wählen Sie nur die Spalten aus, aus denen Ihr "eindeutiger" Wert besteht, für den Sie möglicherweise weitere hinzufügen möchten.
->select('pid','date')
um alle eindeutigen Werte für einen Benutzer an einem Tag zu erhaltenquelle
Sie können die folgenden Methoden verwenden, um die eindeutigen Daten gemäß Ihren Anforderungen wie folgt abzurufen:
Hoffe das wird funktionieren.
quelle
Würde das nicht funktionieren?
Siehe hier für die Diskussion ..
quelle
get()
Aufruf die Abfrage ausführt und die Ergebnisse aus der Datenbank zurückgibt und danncount()
die Sammlung ausführt .Denken Sie daran, dass die Gruppe nach optional ist. Dies sollte in den meisten Fällen funktionieren, wenn eine Zählgruppe nach doppelte Auswahlwerte ausschließen soll. AddSelect ist eine Querybuilder-Instanzmethode.
quelle
Distinct nimmt keine Argumente an, da DISTINCT in Ihre SQL-Abfrage eingefügt wird. Möglicherweise müssen Sie jedoch den Spaltennamen definieren, mit dem Sie einen bestimmten Namen auswählen möchten. Wenn Sie also
Flight->select('project_id')->distinct()->get()
gleich sindSELECT DISTINCT 'project_id' FROM flights
und jetzt andere Modifikatoren wie count () oder sogar beredte Abfragen hinzufügen können.quelle
Basierend auf Laravel-Dokumenten für Rohabfragen konnte ich die Anzahl für ein ausgewähltes Feld ermitteln, um mit diesem Code im Produktmodell zu arbeiten.
Diese Fassade hat dazu beigetragen, das gleiche Ergebnis in der Steuerung zu erzielen:
Der resultierende Speicherauszug für beide Abfragen war wie folgt:
quelle
Das hat bei mir funktioniert, also versuchen Sie Folgendes: $ ad-> getcodes () -> unique ('pid') -> count ()
quelle
Versuche dies
quelle