Естественно у них есть рейтинг, модераторы, закладки в избранное.
Вопрос, собственно, вот в чем, так и должно быть, что запросы такие мудреные? или это нормально?
пример:
$query = "SELECT T.*, U.`avatar`, U.`login`, DATE_FORMAT(T.`date`, '%d.%m.%Y %H:%i') AS `my_date`, B.`name` AS `blog_name`, B.`sname` AS `blog_sname`" . ( (isset($_SESSION['user_id'])) ? ", F.`id` AS `favourite`, R.`id` as `rated`, BM.`id` AS `moderator`" : ", '' AS `favourite`, '' AS `rated`" ) . "
FROM `" . db::table('topics') . "`AS T
JOIN `" . db::table('blogs') . "` AS B
ON B.`id`=T.`parent_id`
LEFT JOIN `" . db::table('users') . "` AS U
ON T.`author`=U.`id`
" . ( (isset($_SESSION['user_id'])) ? "
LEFT JOIN `" . db::table('blogs-moders') . "` AS BM
ON BM.`blog_id`=B.`id` AND BM.`user_id`={$_SESSION['user_id']}
LEFT JOIN `" . db::table('topics-fav') . "` AS F
ON F.`topic_id`=T.`id` AND F.`user_id`={$_SESSION['user_id']}
LEFT JOIN `" . db::table('topics-rating') . "` AS R
ON R.`topic_id`=T.`id` AND R.`user_id`={$_SESSION['user_id']}
" : "" ) . "
" . ( ($main) ? "WHERE T.`rating`>={$rating_limit}" : "" ) . "
ORDER BY T.`date` DESC
LIMIT {$pager['start']}, {$perpage}";
т.е. в нем мы сразу вытащим — голосовал ли за топик юзер, является ли он модером в блоге топика и добавил ли он топик в избранное
сразу скажу, замеры не проводил, но если отклеивать джоины и сувать в цикл → думаю, что это бред
(про вынос DATE_FORMAT не говорить, знаю))