Я работаю над созданием форума с коханой. Я знаю, что уже есть хорошее бесплатное программное обеспечение для форумов, но оно предназначено для семейного сайта, поэтому я решил использовать его в качестве учебного процесса. Я также не использую ORM, встроенный в Kohana, так как я хотел бы узнать больше о SQL в процессе создания форума.
Для моего форума у меня есть 4 основных таблицы:
USERS
TOPICS
POSTS
COMMENTS
ТЕМЫ таблица: идентификатор (с автоинкрементом), строка темы.
ПОЛЬЗОВАТЕЛИ таблица: имя пользователя, адрес электронной почты, имя и фамилия и несколько других не связанных строк
POSTS таблица: id (с автоинкрементом), post-title, post-body, идентификатор темы, id пользователя, post-date, update-date, updated-by (который будет содержать идентификатор пользователя, который сделал самый последний комментарий)
КОММЕНТАРИИ таблица: id (с автоинкрементом), post-id, id пользователя и комментарий
На главной странице форума мне хотелось бы иметь:
- список всех тем
- количество постов по каждой теме
- последнее обновленное сообщение, и кто его обновил
- самая последняя обновленная тема, которая, вероятно, стоит на вершине, скорее всего, "ORDER BY update-date"
Вот мой запрос:
SELECT topics.id AS topic-id,
topics.topic,
post-user.id AS user-id,
CONCAT_WS(' ', post-user.first-name, post-user.last-name) AS name,
recent-post.id AS post-id,
post-num.post-total,
recent-post.title AS post-title,
recent-post.update_date AS updated-date,
recent-post.updated-by AS updated-by
FROM topics
JOIN (SELECT posts.topic-id,
COUNT(*) AS post-total
FROM POSTS
WHERE posts.topic-id = topic-id
GROUP BY posts.topic-id) AS post-num ON topics.id = post-num.topic-id
JOIN (SELECT posts.*
FROM posts
ORDER BY posts.update-date DESC) AS recent-post ON topics.id = recent-post.topic-id
JOIN (SELECT users.*,
posts.user-id
FROM users, posts
WHERE posts.user-id = users.id) as post-user ON recent-post.user_id = post-user.id
GROUP BY topics.id
Этот запрос почти работает, так как он получает всю информацию по темам, у которых есть сообщения. Но он не возвращает темы, у которых нет сообщений .
Я уверен, что запрос является неэффективным и неправильным, поскольку он делает два подвыбора в таблице сообщений, но это был единственный способ, с помощью которого я смог добраться до точки, в которой я нахожусь.