Я просто изучаю php по мере продвижения, и я полностью потерялся здесь. Я никогда раньше не использовал join, и я думаю, что мне нужно здесь, но я не знаю. Я не жду, что кто-то сделает это за меня, но если бы вы могли просто указать мне в правильном направлении, это было бы потрясающе. Я пробовал читать о соединениях, но существует около 20 различных методов, и я просто заблудился.
По сути, я написал форум вручную, и он работает нормально, но неэффективно.
У меня есть board_posts (для сообщений) и board_forums (для форумов, категорий, а также разделов).
Часть, которую я переделываю, - это то, как я получаю информацию о последнем посте для индексной страницы. Я настроил его так: чтобы избежать использования объединений, я храню информацию о последнем посте в таблице для board_forums, так что, скажем, есть раздел под названием «Вне темы», там у меня будет поле для «forum_lastpost_username / userid / posttitle / posttime ", который я обновляю, когда пользователь публикует сообщения и т. д. Но это плохо, я пытаюсь получить все это динамически и избавиться от этих полей.
Прямо сейчас мой запрос такой:
`SELECT * FROM board_forums WHERE forum_parent='$forum_id''
И затем у меня есть материал, из которого я беру информацию для этого форума (имя, описание и т. д.), И все данные для последнего сообщения находятся там:
$last_thread_title = $forumrow["forum_lastpost_title"];
$last_thread_time = $forumrow["forum_lastpost_time"];
$lastpost_username = $forumrow["forum_lastpost_username"];
$lastpost_threadid = $forumrow["forum_lastpost_threadid"];
Но мне нужно избавиться от этого и получить его с board_posts. В board_posts он настроен так, что если это поток, post_parentpost равен NULL, если это ответ, то в этом поле указан идентификатор потока (первое сообщение в теме). Итак, мне нужно получить последний post_date, посмотреть, какой пользователь это опубликовал, ЗАТЕМ посмотреть, имеет ли parentpost значение NULL (если оно равно null, то последнее сообщение является новым потоком, поэтому я могу получить всю информацию о заголовке и пользователе там, но если это не так, то мне нужно получить информацию (заголовок, идентификатор) первого сообщения в этом потоке (который можно найти, посмотрев, что такое post_parentpost, найдя этот идентификатор и получив от него заголовок.
Это имеет какое-либо значение? Если да, пожалуйста, помогите мне :(
Любая помощь приветствуется !!!!






Обновление board___forums всякий раз, когда добавляется сообщение или ответ, - с точки зрения производительности - не самая плохая идея. Для отображения страницы индекса вам нужно только выбрать данные из одной таблицы board_forums - это определенно намного быстрее, чем выбор второй таблицы для получения «информации о последних сообщениях», даже при использовании умного соединения.
Лучше просто обновлять статистику по каждому действию, новому сообщению, удалению сообщения и т. д.
Другие экземпляры, скорее всего, не потребуют обновления статистики (удаление темы вызовет обновление форума, чтобы показать на одну тему меньше в количестве тем).
Подумайте обо всех действиях пользователя, в большинстве случаев вам не нужно обновлять какую-либо статистику, поэтому получение подсчетов на лету очень неэффективно, и вы правы, что так думаете.
Простое решение приведет к многочисленным запросам, некоторые из которых, как вы уже обнаружили, являются необязательными.
Классический подход к этому - кэшировать результаты и извлекать их только время от времени. Кэш не обязательно должен жить долго; даже две-три секунды на загруженном сайте будут иметь большое значение.
В любом случае вам поможет преобразование данных в таблицу, которую вы уже читаете. Такой подход избавляет вас от необходимости выяснять необязательные запросы и может быть немного дешевым выигрышем, потому что это всего лишь еще одно обновление, когда вставка уже происходит. Но это переносит некоторую целостность данных в приложение.
Кстати, вы можете столкнуться с проблемой рекурсивного запроса в ваших потоках. Реляционные базы данных не очень хорошо хранят иерархические данные, если вы используете «простой» алгоритм. Лучший способ - это то, что иногда называют «установленными деревьями». К сожалению, Google это немного сложно, поэтому здесьнаходятсянекоторыйссылки.
Похоже, ты уже поступил правильно.
Если бы вы присоединились, вы бы сделали это так:
SELECT * FROM board_forums
JOIN board_posts ON board_posts.forum_id = board_forums.id
WHERE forum_parent = '$forum_id'
Проблема в том, что он дает вам каждый пост, что бесполезно (и очень медленно). Что бы вы сделали хочу, это что-то вроде этого
SELECT * FROM board_forums
JOIN board_posts ON board_posts.forum_id = board_forums.id ORDER BY board_posts.id desc LIMIT 1
WHERE forum_parent = '$forum_id'
за исключением того, что SQL так не работает. Вы не можете упорядочить или ограничить соединение (или сделать много других подобных вещей), поэтому вам нужно получить каждую строку, а затем сканировать их в коде (что отстой).
Короче, не волнуйтесь. Используйте объединения в реальном случае, когда вы хотите загрузить все форумы и все сообщения одним обращением.
Спасибо, и вы правы, это не так уж плохо, но это огромная проблема, потому что, если кто-то удаляет сообщение / ветку, или редактирует сообщение, или модератор перемещает сообщение в другой раздел, его нужно обновлять каждый раз и т. д. Вот почему я просто хотел найти способ получить его прямо из таблицы сообщений.