5

I have three tables: student, subject and score.
I want to display the details of max(subject_id) of each student.

student table

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

subject table

subject_id    sub_name
   200         Maths
   300         English
   400         Science

score table

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

The result should be:

student_id    student_name     subject_id      score
     1          Sharukh           300            20
     2          Amir              300            10
Ulf Gjerdingen
  • 1,414
  • 3
  • 16
  • 20
user2431727
  • 877
  • 2
  • 15
  • 46
  • Possible duplicate of [SQL Select only rows with Max Value on a Column](http://stackoverflow.com/questions/7745609/sql-select-only-rows-with-max-value-on-a-column) – Richard Smith Jun 22 '16 at 09:53

3 Answers3

4

Use the MAX function and GROUP BY your other selections.

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

Output:

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

SQL Fiddle: http://sqlfiddle.com/#!9/71c46a/7/0

Without the 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)
Matt
  • 14,906
  • 27
  • 99
  • 149
3

Try this;)

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

Blank
  • 12,308
  • 1
  • 14
  • 32
3

Here no need to use all three tables, You can get ans from table student and score.

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;