MySQL usa gourp by para obtener el valor máximo de un campo después de agrupar

1. Descripción de la empresa

En el desarrollo diario, todos inevitablemente se encuentran con requisitos comerciales, como agrupar una tabla y tomar el valor máximo y el valor más reciente, lo que implica funciones de agrupación por y máxima. por ejemplo:
Inserte la descripción de la imagen aquí

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');

Aquí hay un negocio: saca la mejor puntuación de todos en una sola asignatura.

Segundo, el problema reaparece

Mi primer pensamiento de SQL es:

select name,subject,max(score) from score group by name

El resultado de la operación es:
Inserte la descripción de la imagen aquí
puedes ver que el nombre y la puntuación son correctos, pero los sujetos son todos chinos. ¡Obviamente incompatible con la realidad! (Agrupar por toma los primeros datos por defecto)

Nota:
Intenté nuevamente aquí para ordenar primero, y luego agrupar valores, pero el resultado sigue siendo el mismo que el anterior

select 
	temp.name,temp.subject,max(temp.score) 
from 
	(select * from score order by score desc) temp 
group by temp.name

Tres, la solución

1. Primero saca el nombre y la puntuación máxima

select name,max(score) from score group by name

2. Utilice los datos consultados anteriormente como tabla temporal para consultar la tabla original.

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

El resultado final es: el
Inserte la descripción de la imagen aquí
problema está resuelto, espero que pueda ayudar a todos. Si tiene una mejor solución, deje un mensaje en el área de comentarios.

Supongo que te gusta

Origin blog.csdn.net/weixin_42201180/article/details/107359673
Recomendado
Clasificación