Вы, кажется, хотите статус по состоянию на 2019-05-31. Коррелированный подзапрос кажется самым простым решением:
select t.*
from t
where t.date = (select max(t2.date)
from t t2
where t2.post_id = t.post_id and
t2.date <= '2019-05-31'
);
Чтобы получить общедоступные, просто добавьте условие WHERE
:
select t.*
from t
where t.date = (select max(t2.date)
from t t2
where t2.post_id = t.post_id and
t2.date <= '2019-05-31'
) and
t.status = 'public';
Для производительности вам нужен индекс на (post_id, date)
.
Вы также можете сформулировать это, используя JOIN
:
select t.*
from t join
(select t2.post_id, max(t2.date) as max_date
from t t2
where t2.date <= '2019-05-31'
group by t2.post_id
) t2
on t2.max_date = t.date
where t.status = 'public';
Я ожидаю, что коррелированный подзапрос будет иметь лучшую производительность с правильными индексами. Однако иногда MySQL меня удивляет.