前兩天去面試,面試官出了兩道很有意思的mysql題目,當(dāng)時(shí)沒有寫出來,下來自己做的時(shí)候發(fā)現(xiàn)真的沒那么簡(jiǎn)單,所以必須記錄下來。
現(xiàn)在有三個(gè)表
學(xué)生表 student
student_id ? ? ? ? ? ? student_name
課程表 course
course_id ? ? ? ? ? ? ?course_name
成績(jī)表 grades
student_id? ? ? ? ? ? ? course_id ? ? ? ? ? ? ? ?grade
題目一:找到所有每門課都及格的學(xué)生
思路:分組查找每個(gè)學(xué)生的最低分,過濾掉最低分小于60的同學(xué)
SELECT student.student_name AS pass_student, MIN(grades.grade) AS min_score
FROM student INNER JOIN grades ON student.student_id = grades.student_id
GROUP BY student.student_id
HAVING min_score >= 60;
題目二:找到每門課程的最高分對(duì)應(yīng)的學(xué)生名字
思路:如果想要三表聯(lián)合查詢,以課程分組的最大值,學(xué)生姓名和課程名字的話,你會(huì)發(fā)現(xiàn)學(xué)生姓名是錯(cuò)的,因?yàn)榉纸M之后,學(xué)生姓名會(huì)變成該組第一個(gè)學(xué)生,而不是最高分對(duì)應(yīng)的學(xué)生。
可行的查詢方法如下:
-- CREATE TABLE a AS
-- SELECT course.course_id, student_id, course_name, grade FROM
-- course INNER JOIN grades ON course.course_id = grades.course_id;
-- CREATE TABLE b AS
-- SELECT student.student_id, student_name, course_id,? course_name, grade
-- FROM a INNER JOIN student ON student.student_id = a.student_id;
/×在表b中找到分組后的最高分和對(duì)應(yīng)的course_id, 然后在一個(gè)總表中查找對(duì)應(yīng)最高分和course_id的student_name和course_name×/
SELECT b.course_name, b.student_name, b.grade AS max_score FROM b,
(SELECT course_id, MAX(grade) AS max_score FROM a GROUP BY course_id)c
WHERE b.course_id = c.course_id AND b.grade = c.max_score
這段代碼的麻煩之處是又重新建了兩個(gè)表,雖然說肯定會(huì)有更好的辦法,但懶得再想了,多學(xué)一陣再說吧