Простой select запрос с mysql, но не могу сообразить как сделать

Есть вот такая таблица
id,category_id,post_id,added

Нужно выбрать для каждой категории(catefory_id) по 2 последних добавленных(added) поста(post_id) одним запросом.
  • Вопрос задан
  • 2994 просмотра
Пригласить эксперта
Ответы на вопрос 3
sHinE
@sHinE
веб-разработчик, php/js/mysql и сопутствующее
habrahabr.ru/qa/437/
не оно?
Ответ написан
Комментировать
@edogs
Есть несколько извращенный способ для эстетов, суть которого сводится примерно к этому
select * from table as a 
left join table as b on a.added<b.added and a.category_id=b.category_id
left join table as c on b.added<c.added and b.category_id=c.category_id
where b.id is not null and c.id is null 

Вместо added можно использовать id, собственно так будет быстрее и суть скорее всего будет та же, но уж ключ на added должен быть обязательно.
При всей странности этого селекта, его скорость может удивлять по сравнению с другими способами, но только на небольших таблицах.
Самоочевидный смысл состоит в том, что бы вытянуть «по горизонтали» записи, а потом оставить только те, у которых нет последнего элемента, т.е. те, которые и будут последними.



При всем при этом, намного более правильным способом является введение доп. поля в таблице, в котором будет флаг, говорящий о том, что эта запись является одной из 2 последних. И обновлять это поле при обновлении данных в таблице.
Ответ написан
vinxru
@vinxru
Можно еще переменные использовать.

select id, cetegory_id, post_id, added from (select *, ifnull(@b,0)<>cetegory_id as w,
@b:=@c, @c:=cetegory_id from tbl order by cetegory_id, added desc) as x where w;

Вложенный запрос можно исключить
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы