tema
Hay 2 tablas, tabla de usuario, tabla de puntuación
- 1. Averigüe las tres materias principales en las calificaciones de cada persona
- 2. Descubre los tres primeros resultados de cada asignatura
-- 用户表
CREATE TABLE `user_info` (
`id` int NOT NULL AUTO_INCREMENT,
`name` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL,
`age` int DEFAULT NULL,
`email` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
-- 用户数据
INSERT INTO `user_info`(`id`, `name`, `age`, `email`) VALUES (1, 'moss', 33, '[email protected]');
INSERT INTO `user_info`(`id`, `name`, `age`, `email`) VALUES (2, 'jim', 25, '[email protected]');
INSERT INTO `user_info`(`id`, `name`, `age`, `email`) VALUES (3, 'tom', 18, '[email protected]');
-- 成绩表
CREATE TABLE `user_course` (
`id` int NOT NULL AUTO_INCREMENT,
`user_id` int DEFAULT NULL,
`course` varchar(30) COLLATE utf8mb4_general_ci DEFAULT NULL,
`score` int DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=19 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
-- 成绩数据
INSERT INTO `user_course`(`id`, `user_id`, `course`, `score`) VALUES (1, 1, '语文', 90);
INSERT INTO `user_course`(`id`, `user_id`, `course`, `score`) VALUES (2, 1, '数学', 66);
INSERT INTO `user_course`(`id`, `user_id`, `course`, `score`) VALUES (3, 1, '英语', 80);
INSERT INTO `user_course`(`id`, `user_id`, `course`, `score`) VALUES (4, 1, '物理', 50);
INSERT INTO `user_course`(`id`, `user_id`, `course`, `score`) VALUES (5, 1, '综合', 100);
INSERT INTO `user_course`(`id`, `user_id`, `course`, `score`) VALUES (6, 2, '语文', 88);
INSERT INTO `user_course`(`id`, `user_id`, `course`, `score`) VALUES (7, 2, '数学', 70);
INSERT INTO `user_course`(`id`, `user_id`, `course`, `score`) VALUES (8, 2, '英语', 99);
INSERT INTO `user_course`(`id`, `user_id`, `course`, `score`) VALUES (9, 2, '政治', 70);
INSERT INTO `user_course`(`id`, `user_id`, `course`, `score`) VALUES (10, 2, '艺术', 66);
INSERT INTO `user_course`(`id`, `user_id`, `course`, `score`) VALUES (11, 3, '语文', 68);
INSERT INTO `user_course`(`id`, `user_id`, `course`, `score`) VALUES (12, 3, '画画', 80);
INSERT INTO `user_course`(`id`, `user_id`, `course`, `score`) VALUES (13, 3, '化学', 70);
INSERT INTO `user_course`(`id`, `user_id`, `course`, `score`) VALUES (14, 3, '英语', 98);
INSERT INTO `user_course`(`id`, `user_id`, `course`, `score`) VALUES (15, 4, '语文', 80);
INSERT INTO `user_course`(`id`, `user_id`, `course`, `score`) VALUES (16, 4, '英语', 88);
INSERT INTO `user_course`(`id`, `user_id`, `course`, `score`) VALUES (17, 4, '数学', 90);
INSERT INTO `user_course`(`id`, `user_id`, `course`, `score`) VALUES (18, 4, '历史', 99);
Datos de usuario
Datos de calificación
1. Averigüe las tres materias principales en las calificaciones de cada persona
ideas para resolver problemas
- Paso 1: La hoja de puntaje se clasifica de acuerdo con los puntajes de las materias de cada persona para obtener la clasificación de los puntajes de las materias de cada individuo.
SELECT c1.user_id, c1.course, c1.score, (
SELECT count(DISTINCT c2.score)
FROM user_course c2
WHERE c1.score < c2.score
AND c1.user_id = c2.user_id
) + 1 AS num
FROM user_course c1
ORDER BY c1.user_id, num
clasificación de resultados
- El segundo paso: nombrar el conjunto de resultados obtenido en el primer paso c3, y luego consultar el número menor o igual a 3 en c3 y ordenarlos por tema
SELECT c3.user_id, c3.course, c3.score
FROM (
SELECT c1.user_id, c1.course, c1.score, (
SELECT count(DISTINCT c2.score)
FROM user_course c2
WHERE c1.score < c2.score
AND c1.user_id = c2.user_id
) + 1 AS num
FROM user_course c1
HAVING num <= 3
ORDER BY c1.user_id, num
) c3
ORDER BY c3.user_id ASC, c3.score DESC
resultado
- Paso 3: realice una combinación izquierda en el resultado final de la consulta y la tabla user_info para averiguar el nombre de usuario
select u.name, c4.course, c4.score
from user_info u
LEFT JOIN (
SELECT c3.user_id, c3.course, c3.score
FROM (
SELECT c1.user_id, c1.course, c1.score, (
SELECT count(DISTINCT c2.score)
FROM user_course c2
WHERE c1.score < c2.score
AND c1.user_id = c2.user_id
) + 1 AS num
FROM user_course c1
HAVING num <= 3
ORDER BY c1.user_id, num
) c3
ORDER BY c3.user_id ASC, c3.score DESC
) c4 ON u.id = c4.user_id
resultado
2. Descubre los tres primeros resultados de cada asignatura
La idea es la misma que la anterior, primero clasifique de acuerdo con los resultados de cada tema y luego filtre los 3 primeros
SELECT c3.user_id, c3.course, c3.score
FROM (
SELECT c1.user_id, c1.course, c1.score, (
SELECT count(DISTINCT c2.score)
FROM user_course c2
WHERE c1.score <= c2.score
AND c1.course = c2.course
) AS num
FROM user_course c1
HAVING num <= 3
ORDER BY c1.course, c1.score desc
) c3
resultado