Нужна помощь с Join - PullRequest
0 голосов
/ 27 июня 2009

Итак, я пытаюсь построить простой форум. Это будет список тем в порядке убывания по дате либо темы (если нет ответов), либо последнего ответа. Вот структура БД:

Тема
id, subject, date, poster

Сообщения
id, topic_id, message, date, poster

Сам форум будет состоять из таблицы HTML со следующими заголовками:
Topic | Last Post | Replies

Как будет выглядеть запрос или запросы для создания такой структуры? Я думал, что это потребует перекрестного соединения, но не уверен ... Заранее спасибо.

Ответы [ 3 ]

1 голос
/ 27 июня 2009

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

0 голосов
/ 27 июня 2009

Сам форум будет состоять из HTML-таблица со следующими заголовками:
Topic | Last Post | Replies

Если «Последнее сообщение» подразумевает дату, это просто.

SELECT
  t.id,
  t.subject,
  MAX(p.date) AS last_post,
  COUNT(p.id) AS count_replies
FROM 
  Topics t
  INNER JOIN Posts p ON p.topic_id = t.id
GROUP BY
  t.id,
  t.subject

Если вы хотите, чтобы другие вещи отображались вместе с последней датой публикации, например, id или poster, она становится немного более сложной.

SELECT
  t.id,
  t.subject,
  aggregated.reply_count,
  aggregated.distinct_posters,
  last_post.id,
  last_post.date,
  last_post.poster
FROM 
  Topics t
  INNER JOIN (
    SELECT   topic_id,
             MAX(p.date) AS last_date,
             COUNT(p.id) AS reply_count,
             COUNT(DISTINCT poster) AS distinct_posters
    FROM     Posts
    GROUP BY topic_id
  ) AS aggregated ON aggregated.topic_id = t.id
  INNER JOIN Posts AS last_post ON p.date = aggregated.last_date

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

Запрос основан на предположении, что никакие два сообщения в одной теме не могут иметь одинаковую дату. Если вы ожидаете, что это произойдет, запрос должен быть изменен, чтобы учесть его.

0 голосов
/ 27 июня 2009
SELECT *
FROM 
    `Topics`, 
    (
        SELECT *, COUNT(*) AS `replies`
        FROM `Posts`
        GROUP BY `Posts`.`topic_id`
        ORDER BY `Posts`.`date` DESC
    ) AS `TopicPosts`
WHERE `Topics`.`id` = `TopicPosts`.`topic_id` 
ORDER BY `Posts`.`date` DESC

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

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