Несколько сложный оператор MySQL - PullRequest
4 голосов
/ 12 мая 2011

Я создаю форум и застрял при создании страницы, на которой будут отображаться все темы для данного форума.Три соответствующие таблицы и поля структурированы следующим образом:

Table: forums_topics    Table: forums_posts    Table: users
--------------------    -------------------    ------------
int id                  int id                 int id
int forum_id            int topic_id           varchar name
int creator             int poster
tinyint sticky          varchar subject
                        timestamp posted_on

Я начал со следующего SQL:

   SELECT t.id, 
          t.sticky, 
          u.name AS creator, 
          p.subject, 
          COUNT(p.id) AS posts,
          MAX(p.posted_on) AS last_post
     FROM forums_topics AS t
     JOIN users AS u
LEFT JOIN forums_posts AS p ON p.topic_id = t.id
    WHERE t.forum_id = 1 
      AND u.id = t.creator
 GROUP BY t.id
 ORDER BY t.sticky

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

Теперь у меня проблемы с тем, как я могу добавить к этому, чтобы получить название самого последнего плаката.Может кто-нибудь объяснить, как я бы отредактировал свой SQL для этого?Я могу предоставить более подробную информацию, если необходимо, или реструктурировать свои таблицы, если это облегчит задачу.

1 Ответ

1 голос
/ 13 мая 2011

Вот простой способ сделать это:

SELECT t.id, 
      t.sticky, 
      u.name AS creator, 
      p.subject, 
      COUNT(p.id) AS posts,
      MAX(p.posted_on) AS last_post,
      (SELECT name FROM users 
       JOIN forums_posts ON forums_posts.poster = users.id 
       WHERE forums_posts.id = MAX(p.id)) AS LastPoster
 FROM forums_topics AS t
 JOIN users AS u
LEFT JOIN forums_posts AS p ON p.topic_id = t.id
WHERE t.forum_id = 1 
  AND u.id = t.creator
GROUP BY t.id
ORDER BY t.sticky

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

...