Получить темы + имя пользователя последнего автора - PullRequest
1 голос
/ 17 июля 2011

Итак, я пишу небольшой форум и хочу перечислить следующее

  • тема темы
  • имя пользователя, запустившего тему
  • дата начала
  • имя пользователя последнего человека, написавшего в теме
  • дата последнего сообщения

У меня есть три таблицы для этого

счет

+---------------+
| id | username |
|---------------+
| 1  | blargh   |
| 2  | hest     |
+---------------+ 

1020 * потоки *

+----+-------+------+---------+
| id | topic | user | thedate |
+----+-------+------+---------+
| 5  | Yarr  | 1    | bleh    |
+-------------------+---------+

сообщения

+----+---------+------+---------+--------+
| id | content | user | thedate | thread |
+----+---------+------+---------+--------+
| 8  | aaaa    | 1    | aadate  | 5      |
+----+---------+------+---------+--------+
| 9  | bbbb    | 2    | bbdate  | 5      |
+----+---------+------+---------+--------+

Что я хочу:

+----+-------+----------+---------+--------------------+----------------+
| id | topic | username | thedate | last_post_username | last_post_date |
+----+-------+----------+---------+--------------------+----------------+
| 5  | Yarr  | blarg    | bleh    | hest               | bbdate         |
+----+-------+----------+---------+--------------------+----------------+

Вот что я получил до сих пор:

SELECT
forum_threads.id AS id,
forum_threads.topic AS topic,
forum_threads.time AS time,
accounts.username AS username,
Max(forum_posts.id) AS latest_post_id,
forum_posts.`user` AS `user`,
forum_posts.timeposted AS last_post_time
FROM
((forum_threads
JOIN forum_posts ON ((forum_posts.thread = forum_threads.id)))
JOIN accounts ON ((forum_threads.`user` = accounts.id)))

Не получается получить имя пользователя для последнего постера и время для указанного поста

1 Ответ

0 голосов
/ 17 июля 2011

Во-первых, я не вижу в вашей схеме ничего, что связывало бы сообщения с темами.Мой ответ предполагает, что в posts есть дополнительный столбец с именем threadid.

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

SELECT threadid, MAX(id) FROM posts WHERE <...> GROUP BY threadid

Но эффективного способа получить связанное время или идентификатор пользователя из этого запроса не существует.Самое близкое, что я могу получить, это беспорядок:

SELECT threadid, id, user, username, thedate FROM posts
WHERE posts.id IN (
    SELECT threadid, MAX(id) FROM posts WHERE <...> GROUP BY threadid
)

, что невероятно неэффективно для MySQL - оптимизатор полностью разваливается на подзапросах с GROUP BY.(Запрос занимает около 300 мс в тестовой базе данных с менее чем сотней потоков.) Просто прикусите язык, денормализуйте базу данных, сохранив информацию о самой последней записи в потоке, и все будет в порядке.

...