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 :
table d'utilisateurs :
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.
Étape 2 : Requête d'agrégation
Avant de faire la requête d'agrégation, jetons un coup d'œil à tutoriel manuel officiel.
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 ?
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!