Создание собственного форума, помощь в создании запроса, который подсчитывает сообщения в категориях и т. Д. - PullRequest
4 голосов
/ 25 июня 2010

Итак, моя база данных довольно проста.

У меня есть таблица forum_cat (категория форума) и таблица forum_post.

В forum_post есть поле fk_forum_cat_id, которое связывает каждое сообщение форума с категорией.

Каждый forum_post также имеет поле fk_parent_forum_post_id, которое в основном говорит, что оно принадлежит оригинальному сообщению.

Более того, в forum_post есть поле date_added и date_edited.

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

Ответы [ 4 ]

2 голосов
/ 07 июля 2010

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

SELECT c.forum_cat_id,
       COUNT(p.fk_forum_cat_id),
       MAX(p.date_added), 
      (SELECT p2.post_title
           FROM forum_post AS p2 
           WHERE p2.forum_cat_id = c.forum_cat_id
           ORDER BY date_added DESC
           LIMIT 1)
    FROM forum_cat AS c INNER JOIN 
               forum_post AS p ON p.fk_forum_cat_id = c.forum_cat_id
    GROUP BY c.forum_cat_id;
1 голос
/ 02 июля 2010

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

SELECT c.forum_cat_id, COUNT(p.fk_forum_cat_id), MAX(p.date_added), 
    (SELECT p2.post_title FROM forum_post AS p2 
        WHERE p2.forum_post_id = (SELECT MAX(p3.forum_post_id) FROM forum_post AS p3 
            WHERE p3.fk_forum_cat_id = p2.fk_forum_cat_id) AND p2.fk_forum_cat_id = c.forum_cat_id) 
FROM forum_cat AS c INNER JOIN 
    forum_post AS p ON p.fk_forum_cat_id = c.forum_cat_id
GROUP BY c.forum_cat_id;

Мне пришлось угадать некоторые имена полей:

  • forum_cat_id = forum _cat первичный ключ
  • forum_post_id = forum_post первичный ключ
  • post_title = заголовок сообщения или начало текста сообщения вforum_post (зависит от того, что вы хотите показать).
  • Столбец COUNT(p.fk_forum_cat_id) будет содержать количество сообщений в категории

В дополнение к тому, что вы просили, вы получитедата последнего сообщения в категории, так как, я думаю, оно понадобится вам, если это хороший форум;).

Obs: Я не тестировал его, поэтому вам может потребоваться некоторая отладка.Если у вас есть проблемы, дайте мне знать.

0 голосов
/ 03 июля 2010

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

Альтернативой такому запросу может быть суммирование количества сообщений в таблице forum_cat.Создайте столбец с именем что-то вроде posts_count.Каждый раз, когда создается сообщение, достаточно просто выполнить увеличение или уменьшение количества запросов.

ОБНОВЛЕНИЕ forum_cat SET posts_count = posts_count + 1;

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

0 голосов
/ 25 июня 2010

Вы можете адаптировать этот пример к вашей проблеме:

SELECT * 
FROM  `test_post` AS p3
JOIN (

SELECT MAX( id ) AS id
FROM  `test_post` AS p1
JOIN (

SELECT MAX(  `test_post`.date ) AS DATE, cat
FROM  `test_post` 
GROUP BY cat
) AS p2 ON p1.date = p2.date
AND p1.cat = p2.cat
GROUP BY p1.cat
) AS p4 ON p3.id = p4.id;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...