Maison  >  Article  >  cadre php  >  Expliquer la requête d'agrégation de tables conjointes ThinkPHP6 à partir d'exemples

Expliquer la requête d'agrégation de tables conjointes ThinkPHP6 à partir d'exemples

王雪芹
王雪芹original
2020-05-12 10:41:449486parcourir

Il y a quelques jours, un ami a posé une question sur la requête d'agrégation de tables conjointes. Pensant que ce problème peut être difficile à résoudre pour de nombreux novices, j'aimerais le partager maintenant.

Nous avons deux tables de données :

table de bus : Expliquer la requête dagrégation de tables conjointes ThinkPHP6 à partir dexemples

table d'utilisateurs :

Expliquer la requête dagrégation de tables conjointes ThinkPHP6 à partir dexemples

Exigence : Compter le nombre de personnes dans le bus

Comment y parvenir ?

Étape 1 : Joindre des tables

Ce scénario nécessite définitivement de joindre deux tables de données. Ne considérons pas d'abord les statistiques.

 $data=Db::name('user')->alias('a')->join('bus b','a.user_id=b.user_id')->select()->toArray();

alias est un alias, join est la table de données de la table commune et il existe une condition de table commune a.user_id=b.user_id, afin que nous puissions obtenir les données des deux tables de données.

Expliquer la requête dagrégation de tables conjointes ThinkPHP6 à partir dexemples

Étape 2 : Requête d'agrégation

Avant de faire la requête d'agrégation, jetons un coup d'œil à tutoriel manuel officiel.

Expliquer la requête dagrégation de tables conjointes ThinkPHP6 à partir dexemples

Parce que nous voulons finalement obtenir le nombre de statistiques, nous décidons d'abord d'utiliser la méthode count(), nous modifions donc l'instruction de requête :

$data=Db::name('user')->alias('a')->field('count(b.user_id) AS c'')->join('bus b','a.user_id=b.user_id')->select()->toArray();

Parmi eux c, est un alias.

Nous devons effectuer une requête agrégée basée sur le champ user_id. Les statistiques sont basées sur ce champ, nous devons donc être group(user_id), c'est-à-dire regrouper en fonction du champ user_id.

Nous continuons à modifier l'instruction de requête :

$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();

De cette façon, nous obtenons notre résultat final de requête.

Le troisième point : faites attention à la situation

Dans l'instruction de requête ci-dessus, si MySQL est en version 5.7, vous devez payer un prix spécial attention. Par exemple, si vous ajoutez a.* au champ dans mysql5.7, une erreur sera signalée :

 $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]

Pourquoi y a-t-il une telle erreur ?

Expliquer la requête dagrégation de tables conjointes ThinkPHP6 à partir dexemples

MYSQL5.7 a des restrictions sur sql_mode pour de meilleures performances.

ONLY_FULL_GROUP_BY : pour l'opération d'agrégation GROUP BY, si la colonne dans SELECT n'apparaît pas dans GROUP BY, alors ce SQL est illégal car la colonne n'est pas dans la clause GROUP BY, ce qui est une erreur.

On peut modifier la configuration mysql :

Modifier /etc/my.cnf et supprimer only_full_group_by dans sql_mode=

De cette façon , une requête agrégée d'une table commune est réalisée. Lorsque nous rencontrons ce problème, ne soyez pas impatient, nous allons la diviser étape par étape et la mettre en œuvre étape par étape.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn