Для результата, соответствующего максимальной дате каждого учащегося:
MIN или MAX столбца не обязательно совпадают с другими значениями искомых строк, поэтому вам нужно сделать большечем просто рассчитать максимальную дату.В MySQL до версии 8 вы могли сделать что-то вроде этого, вычислив максимальные даты, затем используя их в качестве внутреннего соединения, чтобы ограничить строки теми, которые соответствуют максимальным значениям:
select
temp_grade .*
from table_grade tg
inner join (
select student, max(test_date) as test_date
from table_grade
group by student
) gd on tg.student = gd.student and tg.test_date = gd.test_date
INNER JOIN (
SELECT ID_GRADE,GRADE,NOTE
FROM table_grade_a 'tga'
UNION ALL
SELECT ID_GRADE,TOTAL_GRADE AS GRADE,NOTE
FROM table_grade_a 'tgb'
)temp_grade ON tg.ID_GRADE = temp_grade.ID_GRADE
# WHERE tg.STUDENT = 'MIYA'
В MySQL v8 + выможно использовать row_number() over(...)
вместо:
select
temp_grade .*
from (
select *
, row_number() over(partition by student order by test_date DESC) as rn
from table_grade
) tg
INNER JOIN (
SELECT ID_GRADE,GRADE,NOTE
FROM table_grade_a 'tga'
UNION ALL
SELECT ID_GRADE,TOTAL_GRADE AS GRADE,NOTE
FROM table_grade_a 'tgb'
)temp_grade ON tg.ID_GRADE = temp_grade.ID_GRADE
where tg.rn = 1
# and tg.STUDENT = 'MIYA'