AY> http://pritchi.ru/?top=1
Я бы сделал так:
Сохраняем голоса в таблицу
CREATE TABLE `pritcha_votes` (
`id` bigint(20) unsigned NOT NULL auto_increment,
`pritcha_id` bigint(20) default NULL,
`user_id` bigint(20) default NULL,
`vote` tinyint(4) default NULL,
PRIMARY KEY (`id`)
) TYPE=MyISAM;
Поле user_id не нужно, если голосовать может кто угодно.
Сортируем по среднему баллу, с подсчетом числа голосов за каждую
(хотя, как показано далее, это число можно и не подсчитывать)
SELECT
pritcha_id,
COUNT(*) AS c,
AVG(vote) AS avg_vote
FROM
pritcha_votes
GROUP BY pritcha_id
ORDER BY avg_vote DESC
Получаем массив T1, ключами которого являются pritcha_id (точнее,
настоящими ключами будут, естественно, 0-1-2-3..., но нас интересуют
ключи второго уровня вложенности).
Из других таблиц аналогичным образом получаем число голосов (в массив
T2), число показов (в массив T3), число комментариев (в массив T4).
То есть, обрати внимание, всего четыре запроса для построения
рейтингов, показанных на этом сайте.
После этого, берем foreach T1 и по каждому ключу (pritcha_id)
записываем в него данные из массивов T2, T3, и T4, таким образом,
дополняя его. Потом то же действие проводим с массивом T2,
затем с массивом T3, и с массивом T4.
В результате у нас получается четыре массива, отсортированные каждый
по своему признаку (по среднему баллу, по количеству голосов, по числу
показов, и по числу комментариев). Делаем serialize каждому из них,
записываем в файлы, и пользуемся в течение ближайших 5 минут / часа /
суток. А так как подготовка этих данных будет выполняться не в коде
сайта, а по крону, то сам процесс сбора и подготовки практически никак
не будет влиять на быстродействие отдачи страниц.