Maison  >  Article  >  base de données  >  Expliquer la méthode de tri au sein de MySQL groupe par groupe

Expliquer la méthode de tri au sein de MySQL groupe par groupe

jacklove
jackloveoriginal
2018-06-08 17:28:105501parcourir

La syntaxe group by de MySQL peut regrouper les données selon des règles spécifiées. Le regroupement consiste à diviser un ensemble de données en plusieurs petites zones, puis à cibler plusieurs petites zones. Cet article explique comment implémenter le tri au sein d'un groupe lorsque MySQL utilise group by.

Tutoriels vidéo mysql associés recommandés : "tutoriel mysql"

la syntaxe de groupe mysql par peut regrouper les données, mais les données groupées ne peuvent pas être regroupées en triant au sein des groupes.
Par exemple, si une table de commentaires comporte plusieurs commentaires d'utilisateurs, il est nécessaire d'obtenir le contenu du dernier commentaire de chaque utilisateur.

Créer un tableau de données de test et des données

CREATE TABLE `comment` (  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,  `user_id` int(10) unsigned NOT NULL,  `content` varchar(200) NOT NULL,  `addtime` datetime NOT NULL,  `lastmodify` datetime NOT NULL,  PRIMARY KEY (`id`),  KEY `user_id` (`user_id`),  KEY `addtime` (`addtime`),  KEY `uid_addtime` (`user_id`,`addtime`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;INSERT INTO `comment` (`id`, `user_id`, `content`, `addtime`, `lastmodify`) VALUES(1, 1, '评论1', '2017-05-17 00:00:00', '2017-05-17 00:00:00'),
(2, 1, '评论2', '2017-05-17 00:00:01', '2017-05-17 00:00:01'),
(3, 2, '评论1', '2017-05-17 00:00:02', '2017-05-17 00:00:02'),
(4, 2, '评论2', '2017-05-17 00:00:03', '2017-05-17 00:00:03'),
(5, 3, '评论1', '2017-05-17 00:00:04', '2017-05-17 00:00:04'),
(6, 1, '评论3', '2017-05-17 00:00:05', '2017-05-17 00:00:05'),
(7, 4, '评论1', '2017-05-17 00:00:06', '2017-05-17 00:00:06'),
(8, 4, '评论2', '2017-05-17 00:00:07', '2017-05-17 00:00:07'),
(9, 4, '评论3', '2017-05-17 00:00:08', '2017-05-17 00:00:08'),
(10, 4, '评论4', '2017-05-17 00:00:09', '2017-05-17 00:00:09'),
(11, 3, '评论2', '2017-05-17 00:00:10', '2017-05-17 00:00:10');select * from comment;+----+---------+---------+---------------------+---------------------+| id | user_id | content | addtime             | lastmodify          |
+----+---------+---------+---------------------+---------------------+|  1 |       1 | 评论1   | 2017-05-17 00:00:00 | 2017-05-17 00:00:00 |
|  2 |       1 | 评论2   | 2017-05-17 00:00:01 | 2017-05-17 00:00:01 |
|  3 |       2 | 评论1   | 2017-05-17 00:00:02 | 2017-05-17 00:00:02 |
|  4 |       2 | 评论2   | 2017-05-17 00:00:03 | 2017-05-17 00:00:03 |
|  5 |       3 | 评论1   | 2017-05-17 00:00:04 | 2017-05-17 00:00:04 |
|  6 |       1 | 评论3   | 2017-05-17 00:00:05 | 2017-05-17 00:00:05 |
|  7 |       4 | 评论1   | 2017-05-17 00:00:06 | 2017-05-17 00:00:06 |
|  8 |       4 | 评论2   | 2017-05-17 00:00:07 | 2017-05-17 00:00:07 |
|  9 |       4 | 评论3   | 2017-05-17 00:00:08 | 2017-05-17 00:00:08 |
| 10 |       4 | 评论4   | 2017-05-17 00:00:09 | 2017-05-17 00:00:09 |
| 11 |       3 | 评论2   | 2017-05-17 00:00:10 | 2017-05-17 00:00:10 |
+----+---------+---------+---------------------+---------------------+

Dans le tableau des commentaires, le contenu du dernier commentaire de chaque utilisateur porte l'identifiant 6,4,11,10 enregistrements.

Utilisez groupe par requête

select * from comment group by user_id;
+----+---------+---------+---------------------+---------------------+| id | user_id | content | addtime             | lastmodify          |
+----+---------+---------+---------------------+---------------------+|  1 |       1 | 评论1   | 2017-05-17 00:00:00 | 2017-05-17 00:00:00 |
|  3 |       2 | 评论1   | 2017-05-17 00:00:02 | 2017-05-17 00:00:02 |
|  5 |       3 | 评论1   | 2017-05-17 00:00:04 | 2017-05-17 00:00:04 ||  7 |       4 | 评论1   | 2017-05-17 00:00:06 | 2017-05-17 00:00:06 |
+----+---------+---------+---------------------+---------------------+

pour voir les résultats Après le regroupement, seule la première donnée du groupe sera renvoyée. Parce que la syntaxe group by n'a pas pour fonction de trier au sein du groupe, elle ne sera affichée que selon le tri par défaut de mysql.
Comment trier les données groupe par groupe ? Cela doit être traité en fonction de différents besoins.

1. Celui avec le plus grand identifiant, l'heure du commentaire doit être la plus tardive

Dans ce cas nous peut utiliser l'identifiant au lieu du temps. Recherchez et triez au sein du groupe, utilisez max(id) pour obtenir le plus grand identifiant de commentaire (c'est-à-dire le dernier commentaire) dans chaque groupe

select * from comment where id in(select max(id) from comment group by user_id) order by user_id;
+----+---------+---------+---------------------+---------------------+| id | user_id | content | addtime             | lastmodify          |
+----+---------+---------+---------------------+---------------------+|  6 |       1 | 评论3   | 2017-05-17 00:00:05 | 2017-05-17 00:00:05 |
|  4 |       2 | 评论2   | 2017-05-17 00:00:03 | 2017-05-17 00:00:03 |
| 11 |       3 | 评论2   | 2017-05-17 00:00:10 | 2017-05-17 00:00:10 || 10 |       4 | 评论4   | 2017-05-17 00:00:09 | 2017-05-17 00:00:09 |
+----+---------+---------+---------------------+---------------------+

2. L'ID n'a rien à voir avec l'heure du commentaire. L'heure du commentaire avec l'ID le plus grand peut ne pas être la dernière

Dans ce cas, nous devons utiliser <.>max(addtime) pour obtenir les derniers commentaires, mais comme différents utilisateurs peuvent commenter en même temps, vous devez ajouter la condition user_id à la requête.

Recréez les données de test

truncate table comment;INSERT INTO `comment` (`id`, `user_id`, `content`, `addtime`, `lastmodify`) VALUES(1, 1, &#39;评论1&#39;, &#39;2017-05-17 00:00:00&#39;, &#39;2017-05-17 00:00:00&#39;),
(2, 1, &#39;评论2&#39;, &#39;2017-05-17 00:10:01&#39;, &#39;2017-05-17 00:10:01&#39;),
(3, 2, &#39;评论1&#39;, &#39;2017-05-17 00:10:02&#39;, &#39;2017-05-17 00:10:02&#39;),
(4, 2, &#39;评论2&#39;, &#39;2017-05-17 00:00:03&#39;, &#39;2017-05-17 00:00:03&#39;),
(5, 3, &#39;评论1&#39;, &#39;2017-05-17 00:10:04&#39;, &#39;2017-05-17 00:10:04&#39;),
(6, 1, &#39;评论3&#39;, &#39;2017-05-17 00:00:05&#39;, &#39;2017-05-17 00:00:05&#39;),
(7, 4, &#39;评论1&#39;, &#39;2017-05-17 00:00:06&#39;, &#39;2017-05-17 00:00:06&#39;),
(8, 4, &#39;评论2&#39;, &#39;2017-05-17 00:10:07&#39;, &#39;2017-05-17 00:10:07&#39;),
(9, 4, &#39;评论3&#39;, &#39;2017-05-17 00:00:08&#39;, &#39;2017-05-17 00:00:08&#39;),
(10, 4, &#39;评论4&#39;, &#39;2017-05-17 00:00:09&#39;, &#39;2017-05-17 00:00:09&#39;),
(11, 3, &#39;评论2&#39;, &#39;2017-05-17 00:00:10&#39;, &#39;2017-05-17 00:00:10&#39;);select * from comment;+----+---------+---------+---------------------+---------------------+| id | user_id | content | addtime             | lastmodify          |
+----+---------+---------+---------------------+---------------------+|  1 |       1 | 评论1   | 2017-05-17 00:00:00 | 2017-05-17 00:00:00 |
|  2 |       1 | 评论2   | 2017-05-17 00:10:01 | 2017-05-17 00:10:01 |
|  3 |       2 | 评论1   | 2017-05-17 00:10:02 | 2017-05-17 00:10:02 |
|  4 |       2 | 评论2   | 2017-05-17 00:00:03 | 2017-05-17 00:00:03 |
|  5 |       3 | 评论1   | 2017-05-17 00:10:04 | 2017-05-17 00:10:04 |
|  6 |       1 | 评论3   | 2017-05-17 00:00:05 | 2017-05-17 00:00:05 |
|  7 |       4 | 评论1   | 2017-05-17 00:00:06 | 2017-05-17 00:00:06 |
|  8 |       4 | 评论2   | 2017-05-17 00:10:07 | 2017-05-17 00:10:07 |
|  9 |       4 | 评论3   | 2017-05-17 00:00:08 | 2017-05-17 00:00:08 |
| 10 |       4 | 评论4   | 2017-05-17 00:00:09 | 2017-05-17 00:00:09 |
| 11 |       3 | 评论2   | 2017-05-17 00:00:10 | 2017-05-17 00:00:10 |
+----+---------+---------+---------------------+---------------------+
Les enregistrements qui remplissent les conditions doivent être les enregistrements avec les identifiants

2,3,5,8

select a.* from comment as a right join (select user_id, max(addtime) as maxtime from comment where user_id is not null group by user_id) as b 
on a.user_id=b.user_id and a.addtime=b.maxtime order by a.user_id asc;+------+---------+---------+---------------------+---------------------+| id   | user_id | content | addtime             | lastmodify          |
+------+---------+---------+---------------------+---------------------+|    2 |       1 | 评论2   | 2017-05-17 00:10:01 | 2017-05-17 00:10:01 |
|    3 |       2 | 评论1   | 2017-05-17 00:10:02 | 2017-05-17 00:10:02 |
|    5 |       3 | 评论1   | 2017-05-17 00:10:04 | 2017-05-17 00:10:04 |
|    8 |       4 | 评论2   | 2017-05-17 00:10:07 | 2017-05-17 00:10:07 |
+------+---------+---------+---------------------+---------------------+
Utilisez la jointure à droite pour réduire l'ensemble de données externe.

Là où user_id n'est pas nul, vous pouvez utiliser l'index lors du regroupement par user_id.

Cet article explique la méthode de tri au sein du groupe mysql par groupe Pour plus de contenu connexe, veuillez faire attention au site Web PHP chinois.

Recommandations associées :

Comment utiliser php pour refléter l'API afin d'obtenir des informations de classe

Explication détaillée Lors de l'interrogation de MySQL, le décalage est passé Raisons et méthodes d'optimisation qui affectent grandement les performances

À propos de la méthode d'utilisation de php standard pour supprimer les styles de largeur et de hauteur

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