Я интепретирую
code text
FROM ib_topics
LEFT JOIN ib_posts ON
(ib_topics.tid=ib_posts.topic_id AND ib_posts.author_id=".$ibforums->member['id'].")
WHERE ib_topics.forum_id=".$this->forum['id']."
and ib_topics.approved=1
and (ib_topics.pinned=1 or ib_topics.last_post > $Prune)";
как
1. Выбрать из таблицы ib_post запись, у которой forum_id задан, и одно из двух - либо топик закреплен или/либо дата последнего поста не позже указанной. Заметь, что здесь выбираются и topic_id, и forum_id.
2. Выбрать из таблицы ib_posts все записи (одно поле будет возвращено) для которых задан автор и tid, причем tid задан набором выбранных записей из ib_topics. Иными словами - выбираем только те записи, которые соответствуют выбранному форуму и всем топикам, что нас интересуют. Это действие идет вторым, т.к. использован не PLAIN JOIN, a LEFT JOIN - что является подсказкой движку - сначала первую таблицу просмотреть, а потом вторую.
3. Построить алгебраическое произведение - по условию JOIN-a из таблицы ib_topics вернеться целая туча записей для каждого топика - ровно столько, сколько указанный автор постил туда, т.к. по дате никто не смотрит. Поэтому, если топик горячий, то получим пару сотен author_id - теперь вместо одно отобранной записи мы получим пару сотен - все одинаковые. Вот почему и нужен DISTINCT.
4. Теперь пришла очередь ORDER и DISTINCT - сортируем с удалением дубликатов.
5. Выдаем первые 30 записей.
Вот поэтому я и использовал tid, а не forum_id. Это я пробовал эммулировать JOIN.