Dans mysql8.0 et supérieur, il existe la fonction ROW_NUMBER() OVER (PARTITION BY) qui peut être regroupée et triée au sein du groupe, mais dans les versions inférieures à 5.7, cette fonction n'est pas disponible. Nous pouvons utiliser des variables temporaires pour obtenir cet effet .
1 groupe par
Exemple de demande : nous devons maintenant compter les classements de performance des élèves dans diverses matières. Nous devons installer des matières pour les regrouper, puis les trier dans l'ordre inverse des scores.
Il y a une table d'étudiant comme suit :
CREATE TABLE `student` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键Id',
`name` varchar(5) NOT NULL COMMENT '学生姓名',
`subject` varchar(6) DEFAULT NULL COMMENT '科目',
`score` smallint(3) DEFAULT NULL COMMENT '分数',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8;
Les données du tableau sont les suivantes :
id nom sujet score
1 Zhang San chinois 77
2 Li Si chinois 67
3 Wang Wu chinois 85
4 Zhang San Mathématiques 82
5 Li Si Mathématiques 67
6 Wang Wu Anglais 85
7 Wang Wu Mathématiques 85
SELECT a.NAME, a.score, a.SUBJECT, @last :=IF(@FIRST = a.SUBJECT, @last + 1, 1 ) AS rn, @FIRST := a.SUBJEC