MySQL usa gourp by para obtener el valor máximo y los datos más recientes 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:
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:
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
problema está resuelto, espero que pueda ayudar a todos. Si tiene una mejor solución, deje un mensaje en el área de comentarios.