Maison >base de données >tutoriel mysql >Explication détaillée de l'utilisation spécifique de count(), group by, order by dans MySQL
mysql dans ordreer par tri requête , ordre croissant asc, ordre décroissant, groupe par groupe requête, avoir peut être utilisé uniquement Dans la clause group by et agissant au sein du groupe, la clause conditionnelle have peut être directement suivie de l'expression de fonction . Les instructions de requête utilisant la clause group by doivent utiliser la fonction agrégation.
J'ai récemment rencontré un problème lors de la messagerie instantanée, et ces trois mots-clés étaient utilisés en même temps. Il s'agit d'interroger les détails des messages hors ligne d'une personne. Les détails renvoyés par notre serveur au client incluent trois contenus. Le premier nécessite la liste des personnes ou des groupes qui vous ont envoyé des messages pendant la période hors ligne. des messages hors ligne ont été envoyés par une certaine personne ou un certain groupe, et le troisième extrait le dernier et l'affiche. Évidemment, regroupez par groupes les personnes ou les groupes qui vous ont envoyé des messages hors ligne, count() obtient le nombre de messages hors ligne et triez par ordre chronologique les derniers messages.
select count(1) as cnt, msg_data from t_im_chat_offline_msg where to_company_id = ? and to_user_id = ? order by create_time desc group by from_company_id, from_user_id;
Comme prévu, une erreur sera signalée lorsque group by et order by seront récupérés ensemble. Nous pouvons utiliser des sous-requêtes imbriquées.
select count(1) as cnt, msg_data from (select * from t_im_chat_offline_msg where to_company_id = ? and to_user_id = ? order by create_time desc) as temp_table group by from_company_id, from_user_id;
Nous pouvons regrouper l'ensemble de résultats triés et calculer la quantité. Il y a un autre trou caché ici, que j'ai accidentellement évité. En fait, count() rendra l'ordre par tri invalide :
select count(1) as cnt, msg_data from t_im_chat_offline_msg where to_company_id = ? and to_user_id = ? order by create_time desc;
Le dernier enregistrement obtenu par cette instruction , le msg_data est en fait le résultat d'aucun tri, ce qui est l'ordre d'origine de la base de données. Il doit s'agir du message inséré en premier, c'est-à-dire le message avec l'heure la plus ancienne. Afin d'éviter ce problème, la sous-requête imbriquée est d'abord triée ici, puis utilisée avec count() pour l'éviter. Je me suis échappé involontairement, mais heureusement, je l'ai découvert après avoir changé la phrase à plusieurs reprises et l'avoir testée.
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!