Выборка последних записей из нескольких тем

Vikki

Новичок
Выборка последних записей из нескольких тем

Привет :)

Ребят, помогите с запросом, а то коллективный разум уже сутки борется - никак придумать не может.
есть таблица новостей с разделами, т.е. выглядит она так:
news: id, thid /*id раздела*/, name, body, time
надо в один запрос получить по две последние новости для каждого из разделов (допустим их id известны)
Можно конечно делать ORDER BY time DESC LIMIT 0,2, но тем порядка 50 разделов, а соответственно это получится порядка 50 запросов :p

Если кто может - помогите, пожалуйста. :rolleyes:
 

zeltais

Новичок
придумал как сделать 2умя запросами ))
select distinct(thid),* .... order by time desc limit 0,2
и следующим таким же запросом берём не последнюю а предпоследнюю строку =)
 

Vikki

Новичок
По моему ерунда какая-то.
LIMIT 0,2 выдаст в любом случае только первые две темы. Точнее, выдаст первые записи из первых двух тем.
Более того, не очень ясно каким "таким же" запросов выбрать предпоследнюю строку, тут уже order by'ем таким не отделаешься.
 

Wicked

Новичок
хранить в каждом сообщении его порядок в теме с конца, и, соотв-но выбирать WHERE rev_order in (1, 2)
 

pdi

Новичок
Можно вот так поизвращатся

Код:
SELECT * FROM news WHERE id IN (
	SELECT MAX(id) FROM news GROUP BY thid
	UNION
	SELECT MAX(id) FROM news WHERE id NOT IN (
		SELECT MAX(id) FROM news GROUP BY thid
	) GROUP BY thid
) ORDER BY this, time DESC
Если индексы правильно сделать, особо тормозить не должно.
 

Vikki

Новичок
Wicked, идея неплоха, но... получается, что как только мы добавляем новое сообщение, нам надо перелопачивать все старые сообщения и убирать им rev_order. Окей, пусть даже не все, но два последних. В общем-то, вариант даже неплохо, но если нам вдруг приспичет резко поменять кол-во... не 2, а 20 например? В общем, по мне, решение слишком сложное. Хотя, безусловно, решение.

pdi, MAX(id) - это зверство. =) Смотреть всю базу, да еще и три раза - это вдвойте зверство. Хотя, в любом случае, UNION'ы тут не работают, скажите спасибо компании .masterhost, котрой лень перейти на 5ый mySQL :)
 

Wicked

Новичок
Vikki
убирать их и не обязательно. Просто с добавлением нового поста в тему - всем постам прибавлять единичку.
 

dr-sm

Новичок
Wicked
мне кажется, что лучше как раз флаг выставить для тех сообщений которые показываем, ониж и так по time упорядочены.
что-то типа where is_new = 1 order by thid, time.
Vikki
то что при добавлении придется устанавливать / сбрасывать этот флаг, так это наоборот хорошо. вся логика будет локализирована в одном месте (и кол-во тоже), небудет плясок с бубном и лишнего оверхеда при селектах.
 

pdi

Новичок
Автор оригинала: Vikki
pdi, MAX(id) - это зверство. =) Смотреть всю базу, да еще и три раза - это вдвойте зверство. Хотя, в любом случае, UNION'ы тут не работают, скажите спасибо компании .masterhost, котрой лень перейти на 5ый mySQL :)
Можно и MAX(`time`) :), если MAX делать по полю, для которого сделан индекс, всю базу перелопачивать нет необходимости, такой запрос летать будет.

Offtop. Зато работает без дополнительных полей :)

ЗЫ. Если память мне не изменяет, UNION появился в 4.1
 
Сверху