Vor ein paar Tagen fragte ein Freund nach der Aggregationsabfrage gemeinsamer Tabellen. Da ich der Meinung bin, dass dieses Problem für viele Anfänger schwierig zu bewältigen sein könnte, möchte ich es jetzt teilen.
Wir haben zwei Datentabellen:
Bustabelle:
Benutzertabelle:
Anforderung: Anzahl der Personen im Bus zählen
Wie erreicht man das?
Schritt 1: Tabellen verbinden
Dieses Szenario erfordert definitiv die Verknüpfung zweier Datentabellen.
$data=Db::name('user')->alias('a')->join('bus b','a.user_id=b.user_id')->select()->toArray();
Alias ist ein Alias, Join ist die Datentabelle der gemeinsamen Tabelle und es gibt eine gemeinsame Tabellenbedingung a.user_id=b.user_id, damit wir die Daten der beiden Datentabellen abrufen können.
Schritt 2: Aggregationsabfrage
Bevor wir die Aggregationsabfrage durchführen, werfen wir einen Blick auf die offizielles Handbuch-Tutorial.
Da wir letztendlich die Anzahl der Statistiken erhalten möchten, entscheiden wir uns zunächst für die Methode count() und ändern daher die Abfrageanweisung:
$data=Db::name('user')->alias('a')->field('count(b.user_id) AS c'')->join('bus b','a.user_id=b.user_id')->select()->toArray();
Darunter ist c, ein Alias.
Wir müssen eine aggregierte Abfrage basierend auf dem Feld user_id durchführen. Statistiken basieren auf diesem Feld, daher müssen wir eine Gruppe (user_id) sein, d. h. eine Gruppierung gemäß dem Feld user_id.
Wir modifizieren weiterhin die Abfrageanweisung:
$data=Db::name('user')->alias('a')->field('count(b.user_id) AS c')->join('bus b','a.user_id=b.user_id')->group('a.user_id')->select()->toArray();
Auf diese Weise erreichen wir unser endgültiges Abfrageergebnis.
Der dritte Punkt: Achten Sie auf die Situation
Wenn MySQL in der obigen Abfrageanweisung Version 5.7 ist, müssen Sie besonders darauf achten Aufmerksamkeit. Wenn Sie beispielsweise a.* zum Feld in mysql5.7 hinzufügen, wird ein Fehler gemeldet:
$data=Db::name('user')->alias('a')->field('a.*,count(b.user_id) AS c')->join('bus b','a.user_id=b.user_id')->group('a.user_id')->select()->toArray(); [object Object]
Warum gibt es einen solchen Fehler?
MYSQL5.7 hat Einschränkungen für sql_mode für eine bessere Leistung.
ONLY_FULL_GROUP_BY: Wenn bei der Aggregationsoperation GROUP BY die Spalte in SELECT nicht in GROUP BY erscheint, ist diese SQL ungültig, da sich die Spalte nicht in der GROUP BY-Klausel befindet, was eine Fehlerposition darstellt.
Wir können die MySQL-Konfiguration ändern:
Ändern Sie /etc/my.cnf und löschen Sie only_full_group_by in sql_mode=
Auf diese Weise Wenn wir auf dieses Problem stoßen, werden wir es entsprechend den endgültigen Anforderungen Schritt für Schritt aufteilen.
Das obige ist der detaillierte Inhalt vonErläutern Sie die gemeinsame Tabellenaggregationsabfrage von ThinkPHP6 anhand von Beispielen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!