Nano Hash - криптовалюты, майнинг, программирование

Справка по соединению PHP с двумя таблицами

Я просто изучаю 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, найдя этот идентификатор и получив от него заголовок.

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

Любая помощь приветствуется !!!!

18.12.2008

Ответы:


1

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

18.12.2008
  • Спасибо, и вы правы, это не так уж плохо, но это огромная проблема, потому что, если кто-то удаляет сообщение / ветку, или редактирует сообщение, или модератор перемещает сообщение в другой раздел, его нужно обновлять каждый раз и т. Д. Вот почему я просто хотел найти способ получить его прямо из таблицы сообщений. 19.12.2008

  • 2

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

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

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

    19.12.2008

    3

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

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

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

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

    19.02.2009

    4

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

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

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

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

    19.02.2009
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..