PHP присоединиться к справке с двумя таблицами - PullRequest
1 голос
/ 19 декабря 2008

Я только учусь php, и я полностью потерян здесь. Я никогда раньше не использовал join, и думаю, что мне нужно здесь, но я не знаю. Я не ожидаю, что кто-то сделает это для меня, но если бы вы могли просто указать мне правильное направление, это было бы удивительно, я попытался прочитать о соединениях, но есть около 20 различных методов, и я просто потерян. 1001 *

По сути, я вручную закодировал форум, и он работает нормально, но не эффективно.

У меня есть board_posts (для сообщений) и board_forums (для форумов, категорий и разделов).

Часть, которую я переделываю, - это то, как я получаю информацию для последнего поста на странице индекса. Я настроил это так, чтобы избежать использования объединений, я храню информацию о последнем сообщении в таблице для board_forums, так что, скажем, есть раздел «Off Topic», где у меня будет поле для «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 (если он нулевой, то последнее сообщение - это новая тема, поэтому я могу получить всю информацию о заголовке и пользователе, но если это не так, то мне нужно получить информацию (название, идентификатор) первого сообщения в этой теме (что можно узнать, посмотрев, что такое post_parentpost, просмотрев этот идентификатор и получив из него заголовок.

Имеет ли это какой-то смысл? Если так, пожалуйста, помогите мне: (

Любая помощь очень ценится !!!!

Ответы [ 4 ]

3 голосов
/ 19 декабря 2008

Обновление форума___forums всякий раз, когда вставляется сообщение или ответ - в отношении производительности - не самая плохая идея. Для отображения страницы индекса вам нужно только выбрать данные из одной таблицы board_forums - это определенно намного быстрее, чем выбрать вторую таблицу для получения «информации о последних сообщениях», даже при использовании умного соединения.

1 голос
/ 19 февраля 2009

Похоже, вы уже поступили правильно.

Если бы вы присоединились, вы бы сделали это так:

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 так не работает. Вы не можете упорядочить или ограничить объединение (или сделать много других полезных вещей, подобных этому), поэтому вам нужно извлекать каждую строку и затем сканировать их в коде (что отстой).

Короче, не волнуйся. Используйте объединения для реального случая, когда вы хотите загрузить все форумы и все сообщения одним нажатием.

1 голос
/ 19 декабря 2008

Вам лучше просто обновлять статистику по каждому действию, Новому посту, Удалить пост и т. Д.

Другие экземпляры, скорее всего, не потребуют обновления статистики (удаление цепочки вызовет обновление форума, чтобы показать на одну тему меньше в списке тем).

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

0 голосов
/ 19 февраля 2009

Простое решение приведет к многочисленным запросам, некоторые необязательные, как вы уже обнаружили.

Классический подход к этому - кэшировать результаты и извлекать их только время от времени. Кэш не должен жить долго; даже две или три секунды на загруженном сайте будут иметь существенное значение.

Денормализация данных в таблицу, которую вы уже читаете, в любом случае поможет. Такой подход избавляет вас от необходимости выявлять необязательные запросы и может быть немного дешевым, потому что это еще одно обновление, когда вставка уже происходит. Но это переносит некоторую целостность данных в приложение.

Кроме того, вы можете столкнуться с проблемой рекурсивного запроса с вашими потоками. Реляционные базы данных не так хорошо хранят иерархические данные, если вы используете «простой» алгоритм. Лучшим способом является то, что иногда называют «установить деревья». К сожалению, это немного сложно для Google, поэтому здесь некоторые ссылки .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...