MySQL utilise gourp by pour obtenir la valeur maximale et les dernières données d'un champ après le regroupement
1. Description de l'entreprise
Dans le développement quotidien, tout le monde rencontre inévitablement des exigences métier telles que le regroupement d'une table et la prise de la valeur maximale et de la dernière valeur, ce qui implique des fonctions group by et max. par exemple:
SET FOREIGN_KEY_CHECKS=0;
-- ----------------------------
-- Table structure for score
-- ----------------------------
DROP TABLE IF EXISTS `score`;
CREATE TABLE `score` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(36) DEFAULT NULL,
`subject` varchar(36) DEFAULT NULL,
`score` int(10) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of score
-- ----------------------------
INSERT INTO `score` VALUES ('1', '张三', '语文', '92');
INSERT INTO `score` VALUES ('2', '张三', '数学', '100');
INSERT INTO `score` VALUES ('3', '李四', '语文', '95');
INSERT INTO `score` VALUES ('4', '李四', '数学', '75');
INSERT INTO `score` VALUES ('5', '王五', '语文', '85');
INSERT INTO `score` VALUES ('6', '王五', '数学', '96');
INSERT INTO `score` VALUES ('7', '张三', '英语', '99');
INSERT INTO `score` VALUES ('8', '李四', '英语', '76');
INSERT INTO `score` VALUES ('9', '王五', '英语', '99');
Voici une affaire: prenez le meilleur score de tout le monde dans un seul sujet.
Deuxièmement, le problème réapparaît
Ma première pensée à propos de SQL est:
select name,subject,max(score) from score group by name
Le résultat de l'opération est le suivant:
vous pouvez voir que le nom et le score sont corrects, mais les sujets sont tous chinois. Evidemment incompatible avec la réalité! (Grouper par prend les premières données par défaut)
Remarque:
j'ai essayé à nouveau ici de trier d'abord, puis de regrouper les valeurs, mais le résultat est toujours le même que ci-dessus
select
temp.name,temp.subject,max(temp.score)
from
(select * from score order by score desc) temp
group by temp.name
Trois, la solution
1. Retirez d'abord le nom et le score maximum
select name,max(score) from score group by name
2. Utilisez les données interrogées ci-dessus comme table temporaire pour interroger la table d'origine
select
temp_b.name,temp_b.subject,temp_b.score
from
(select name,max(score) score from score group by name) temp_a
inner join score temp_b
on
temp_a.name = temp_b.name and temp_a.score = temp_b.score
Le résultat final est: le
problème est résolu, j'espère qu'il pourra aider tout le monde. Si vous avez une meilleure solution, veuillez laisser un message dans la zone de commentaire.