2016-06-22 70 views
4

我有三個表:student,subjectscore
我想顯示每個學生的max(subject_id)的詳細信息。加入MAX表功能

學生表

student_id student_name exam_date 
    1   Sharukh  24/06/12 
    2   Amir  23/06/12 

主題表

subject_id sub_name 
    200   Maths 
    300   English 
    400   Science 

評分表

student_id subject_id  score 
    1   200   50 
    1   300   20 
    2   300   10 

結果建議立即進行刪除d是:

student_id student_name  subject_id  score 
    1   Sharukh   300   20 
    2   Amir    300   10 
+0

[SQL選擇只在色譜柱的最高值的行(可能的重複http://stackoverflow.com/questions/7745609/sql-select-only-rows-with-max-value-on- a-column) –

回答

4

使用MAX功能和GROUP BY你的其他選擇。

SELECT st.student_id, st.student_name, MAX(su.subject_id) AS subject_id, sc.score 
FROM student st 
INNER JOIN score sc ON st.student_id = sc.student_id 
INNER JOIN subject su ON sc.subject_id = su.subject_id 
WHERE su.subject_id = (SELECT MAX(sca.subject_id) 
         FROM score sca 
         WHERE sc.student_id = sca.student_id 
         GROUP BY sca.student_id) 
GROUP BY st.student_id, st.student_name, sc.score 

輸出:

student_id student_name subject_id score 
1   Sharukh  300   20 
2   Amir   300   10 

SQL小提琴:http://sqlfiddle.com/#!9/71c46a/7/0

沒有GROUP BY

SELECT st.student_id, st.student_name, su.subject_id, sc.score 
FROM student st 
INNER JOIN score sc ON st.student_id = sc.student_id 
INNER JOIN subject su ON sc.subject_id = su.subject_id 
WHERE su.subject_id = (SELECT MAX(sca.subject_id) 
         FROM score sca 
         WHERE sc.student_id = sca.student_id 
         GROUP BY sca.student_id) 
+0

這不會帶來正確的分數! – sagi

+0

@sagi修正.. – Matt

2

試試這個;)

select t1.student_id, t1.student_name, t3.subject_id, t3.score 
from student t1 
inner join subject t2 
inner join score t3 
inner join (
    select max(subject_id) as subject_id, student_id 
    from score group by student_id 
) t4 on t3.student_id = t4.student_id and t3.subject_id = t4.subject_id 
and t2.subject_id = t3.subject_id 
and t1.student_id = t3.student_id 

SQLFiddle DEMO HERE

3

在這裏不需要使用所有三個表,您可以從表學生和分數得到答案。

SELECT c.student_id, c.student_name, c.subject_id, c.score FROM 
(SELECT a.student_id, a.student_name, b.subject_id, b.score FROM student 
a JOIN score b ON a.student_id = b.student_id) c JOIN 
(SELECT student_id, MAX(subject_id) AS subject_id FROM score GROUP  
BY student_id) d 
ON c.student_id = d.student_id AND c.subject_id = d.subject_id;