Heim  >  Artikel  >  PHP-Framework  >  Erläutern Sie die gemeinsame Tabellenaggregationsabfrage von ThinkPHP6 anhand von Beispielen

Erläutern Sie die gemeinsame Tabellenaggregationsabfrage von ThinkPHP6 anhand von Beispielen

王雪芹
王雪芹Original
2020-05-12 10:41:449374Durchsuche

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: Erläutern Sie die gemeinsame Tabellenaggregationsabfrage von ThinkPHP6 anhand von Beispielen

Benutzertabelle:

Erläutern Sie die gemeinsame Tabellenaggregationsabfrage von ThinkPHP6 anhand von Beispielen

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.

Erläutern Sie die gemeinsame Tabellenaggregationsabfrage von ThinkPHP6 anhand von Beispielen

Schritt 2: Aggregationsabfrage

Bevor wir die Aggregationsabfrage durchführen, werfen wir einen Blick auf die offizielles Handbuch-Tutorial.

Erläutern Sie die gemeinsame Tabellenaggregationsabfrage von ThinkPHP6 anhand von Beispielen

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?

Erläutern Sie die gemeinsame Tabellenaggregationsabfrage von ThinkPHP6 anhand von Beispielen

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn