Это было бы намного проще (и более эффективно) в MySQL 8.0, где мы использовали бы для этого оконные функции.
В более ранних версиях одним из вариантов является использование коррелированного подзапроса для извлечения дата следующего просмотра для каждого представления:
select
t.*,
datediff(review_date, submission_date) gapdays
from (
select
student_id,
date submission_date
(
select min(t1.date)
from mytable t1
where
t1.student_id = t.student_id
and t1.date > t.date
and t1.phase = 'review'
) review_date
from mytable t
where t.phase = 'submitted'
) t
order by student_id, submission_date
Для производительности рассмотрите индекс на (student_id, phase, date)
(порядок столбцов в индексе важен здесь).
Демонстрация на DB Fiddle :
| student_id | submission_date | review_date | gapdays |
| ---------- | --------------- | ----------- | ------- |
| 34 | 2019-03-05 | 2019-04-15 | 41 |
| 34 | 2019-04-25 | 2019-05-08 | 13 |
| 78 | 2018-12-06 | 2019-01-01 | 26 |