Подскажите, пожалуйста, как лучше составить запрос

Spear

почемучка
Подскажите, пожалуйста, как лучше составить запрос

Здравствуйте,
есть такая штука: в таблице 'blog_topics' - посты блогов.
Мне нужно вытащить по 1 новому посту из 5 последних обновившихся блогов, и ещё по 4 поста из этих блогов.

Пока вижу только такой вариант - взять из таблицы blog_topics:
SELECT blog_id FROM blogs_topics GROUP BY blog_id ORDER BY topic_date DESC LIMIT 5

Получу 5 блогов в которых были новые посты. И потом в 5 (!) запросов вытащить посты для этих блогов.
Но мне кажется что это можно упросить, чтобы вместо 5+1 запросов все сделать в 1-2
 

prolis

Новичок
[telepat_mode on]
[sql]
select t1.* from blogs_topics t1,
(
SELECT max(topic_id) topic_id, max(topic_date) topic_date FROM blogs_topics GROUP BY blog_id
)
t2
where t1.topic_id=t2.topic_id
order by t2.topic_date desc
limit 5
[/sql]
 

Bullet

Новичок
Столкнулся с подобной проблемой, только мне необходимо выбрать по 5 последних постов из каждого конкретного блога. Как быть в такой ситуации? Подскажите плз ... а то писать для каждого блога отдельный запрос как-то неправильно :(

Получилось только так:
[SQL]select distinct(b1.id), b1.*
from blogs_topics b1
, (select id from blogs_topics where blog_id=2 order by date desc limit 5) b2
, (select id from blogs_topics where blog_id=3 order by date desc limit 5) b3
, (select id from blogs_topics where blog_id=1 order by date desc limit 5) b4
, (select id from blogs_topics where blog_id=8 order by date desc limit 5) b5
where b1.id=b2.id
or b1.id=b3.id
or b1.id=b4.id
or b1.id=b5.id
order by b1.blog_id asc, b1.date desc
limit 20[/SQL]
Но в этом случае, если хоть в одном из перечисленых блогов нету постов, то результат получается пустой :( Как это победить - не пойму...
 

prolis

Новичок
Bullet
раз уж хардкодить идентификаторы блогов, то unuon тебе поможет:
[sql]
SELECT id
FROM blogs_topics
WHERE blog_id = 1
ORDER BY date DESC
LIMIT 5
union
SELECT id
FROM blogs_topics
WHERE blog_id = 2
ORDER BY date DESC
LIMIT 5
[/sql]
 

Bullet

Новичок
Автор оригинала: prolis
Bullet
раз уж хардкодить идентификаторы блогов, то unuon тебе поможет:
Спасибо, UNION помог в решении, только возникла ошибка из-за использования "ORDER BY date DESC" во всех запросах, можно только в конце запроса...
Так же с лимитом какая-то лажа получилась, необходимо в последнем указать общее количество, а в первых по 5... Собсно вот конструкция которая заработала:
[SQL]select *
from blog_topics where blog_id=1 limit 5
union select * from blog_topics where blog_id=2 limit 5
union select * from blog_topics where blog_id=3 limit 5
union select * from blog_topics where blog_id=8 order by blog_id asc, date desc limit 20[/SQL]
 

prolis

Новичок
(фигня какая-то получилась:)
тогда может добавить булевое поле "isnew" (0),
и тогда в простой запрос добавляешь "and isnew=1"
а при добавлении/удалении записи в блог вызывать типа:
[sql]
update blog_topics set isnew=0 where id=
(select min(id) from blog_topics where blog_id=$blog_id and isnew=1);
[/sql]
 
Сверху