Как решить такую задачу более грамотно?

Духовность™

Продвинутый новичок
Как решить такую задачу более грамотно?

Привет.

Есть таблица со статьями, есть таблица рубрик.

Нужно выводить статьи по 4 штуки из каждой рубрики. Рубрик 6 шт.

Я правильно понимаю, что не существует иного способа, кроме как идти циклом по количеству рубрик и делать на каждую рубрику отдельную выборку? Т.е.

PHP:
// получаем id рубрик в массив $rubrics


foreach ($rubrics as $id)
{
     // select ... from ... where id = $id
}
в количестве получается 6 запросов. Можно как-то сократить это количество?
 

fixxxer

К.О.
Партнер клуба
ну, по крайней мере все варианты, которые приходят в голову, заметно тяжелее, чем 6 простых запросов с выборкой по индексу
если уж очень хочется, можно ввести дополнительные поля (например, последовательный order_id в "обратном порядке) и доставать все уже одним запросом, но затраты на поддержание оного наверняка выше чем получаемый выигрыш который все равно мизерный
 

Mr_Max

Первый класс. Зимние каникулы ^_^
Команда форума
Оч. содержательное название топика

upd.

UNION
 

Духовность™

Продвинутый новичок
ну, по крайней мере все варианты, которые приходят в голову, заметно тяжелее, чем 6 простых запросов
Смотрите: http://www.moscow-post.ru/

Видите структуру сайта? На главной выводится большое количество новостей и статей. Для каждой рубрики идет запрос на выборку новостей и статей. Имеем 8 рубрик, т.е. 2 запроса на каждую. В сумме это 16 запросов!

Меня смущает реализация такого подхода, я не уверен, что это правильный подход. А что делать не знаю.

Тут ещё и время генерации страницы доходит до Н-ного количества секунд. То сервер быстро отдает, то долго думает. А с чем это связано - я не пойму. На локалхосте это работает относительно быстро- время генерации занимает 0.2 - 0.5 сек.
 

Gas

может по одной?
triumvirat
кешируй блоки с инфой по каждой рубрике или всю страницу целиком.
 

fixxxer

К.О.
Партнер клуба
да, тут самый правильный вариант это кэш.
либо в статику, либо в memcached по ситуации
 

Духовность™

Продвинутый новичок
а если кэшировать, то я так понимаю, что при каждом новом добавлении новости или статьи делать перегенерацию? а это не накладно?
 

fixxxer

К.О.
Партнер клуба
сейчас у тебя каждый раз генерится, это точно не менее накладно :D

вообще, схема работы с кэшем (memcache, файловым - не важно) обычно такая.

1. для каждой кэшируемой единицы имеется уникальный идентификатор (ключ memcache, имя файла, ...)
2. при выборке смотрим, есть ли информация в кэше, если нет - берем из базы и обновляем кэш
3. при обновлении данных просто удаляем из кэша то, что поменялось
 

Духовность™

Продвинутый новичок
а ключ зачем нужен? почему бы просто не сохранять в кэше файлы с html-кодом под именами имя_рубрики.html ??
 

fixxxer

К.О.
Партнер клуба
имя рубрики это тоже ключ. если оно уникально. ;)

если у тебя есть возможность хранить хтмл-код целиком, и там нигде посередине не надо впихивать разную хитрую динамику - то это вообще замечательно и все сводится к
if (!file_exists($file)) {
// генерируем и не забываем проверять-выставлять флажки, чтобы 10 процессов не генерили одно и то же параллельно
}
readfile($file);
 
Сверху