MySQL utilise gourp by pour obtenir la valeur maximale 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:
Insérez la description de l'image ici

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:
Insérez la description de l'image ici
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
Insérez la description de l'image ici
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.

Je suppose que tu aimes

Origine blog.csdn.net/weixin_42201180/article/details/107359673
conseillé
Classement