Au cours de l'année écoulée, en raison de besoins professionnels, j'ai principalement utilisé des bases de données NoSql, et je me sens de moins en moins familier avec les bases de données relationnelles. Une affaire de meurtre causée par group by
et order by
. est parti de ce né. Notez ici les urgences.
Tout d'abord, examinons la structure globale de la table.
trouve désormais les dernières données dans chaque barCode
.
Parce qu'il y a trop de données, l'effet n'est pas très bon. Prenons comme exemple une donnée avec barCode
comme 4565789
.
SELECTbarCode, priCommodityID, createDateFROMtb_history_versionWHEREbarCode = '4565789'ORDER BYcreateDate DESC;
Puisque je n'ai pas écrit SQL depuis longtemps. J’ai donc d’abord pensé à utiliser une requête combinée group by et order by.
SELECTbarCode, priCommodityID, createDateFROMtb_history_versionWHEREbarCode = '4565789'GROUP BYbarCodeORDER BYcreateDate DESC;
Les résultats sont les suivants :
Vous pouvez voir que ce n'est pas le résultat que nous souhaitons, order by
n'a aucun effet.
Ensuite, essayons de combiner les deux à l’aide de sous-requêtes. Trier d'abord puis regrouper
SELECT*FROM(SELECTbarCode, priCommodityID, createDateFROMtb_history_versionWHEREbarCode = '4565789'ORDER BYcreateDate DESC) AS AGROUP BYA.barCode;
Le résultat est toujours décevant
J'ai essayé les deux méthodes ci-dessus Bien que le résultat est triste, le travail doit continuer. J'ai donc recherché diverses informations en ligne pour voir si je pouvais résoudre le problème d'une autre manière. J'ai accidentellement vu que group_concat
pouvait être trié par groupes, alors j'ai essayé
SELECTbarCode, GROUP_CONCAT( priCommodityIDORDER BYcreateDate DESC) AS priCommodityID, GROUP_CONCAT( createDateORDER BYcreateDate DESC) AS createDateFROMtb_history_versionWHEREbarCode = '4565789';
Les résultats sont les suivants
Vous pouvez voyez que la commande est OK, mais toutes les données sont regroupées. Un traitement supplémentaire des caractères d'interception est requis
SELECTbarCode, SUBSTRING_INDEX( group_concat( priCommodityIDORDER BYcreateDate DESC),',',1) AS priCommodityID, SUBSTRING_INDEX( group_concat( createDateORDER BYcreateDate DESC),',',1) AS createDateFROMtb_history_versionWHEREbarCode = '4565789'GROUP BYbarCode;
ok ! À ce stade, nous constatons que nos besoins initiaux ont été satisfaits.
Utiliser group by
et order by
en même temps n'a aucun effet. Vous pouvez utiliser group_concat
et groub by
à la place. Le tri des champs peut être implémenté dans group_concat
.
http://www.devzxd.top/2017/05/27/mysql-groupby -orderby.html
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!