MySQL LEFT JOIN, INNER JOIN и т. Д., Сложный запрос, PHP + MySQL для форума - PullRequest
1 голос
/ 23 декабря 2010

Итак, у меня есть небольшой форум, для которого я пытаюсь получить данные, есть 4 таблицы, forum, forum_posts, forum_threads и пользователи. То, что я пытаюсь сделать, - это получить последнее сообщение для каждого форума и дать пользователю краткий обзор этого сообщения. Я хочу также получить количество сообщений и количество тем в каждом форуме. Кроме того, я хочу сделать это в одном запросе. Итак, вот что я придумала:

SELECT lfx_forum_posts.*, lfx_forum.*, COUNT(lfx_forum_posts.pid) as posts_count,
    lfx_users.username,
    lfx_users.uid,
    lfx_forum_threads.tid, lfx_forum_threads.parent_forum as t_parent, 
    lfx_forum_threads.text as t_text, COUNT(lfx_forum_threads.tid) as thread_count
    FROM
    lfx_forum
    LEFT JOIN
    (lfx_forum_threads
        INNER JOIN
        (lfx_forum_posts
            INNER JOIN lfx_users
            ON lfx_users.uid = lfx_forum_posts.author)
        ON lfx_forum_threads.tid = lfx_forum_posts.parent_thread AND lfx_forum_posts.pid = 
                (SELECT MAX(lfx_forum_posts.pid)
                FROM lfx_forum_posts
                WHERE lfx_forum_posts.parent_forum = lfx_forum.fid
                GROUP BY lfx_forum_posts.parent_forum)
    )
    ON lfx_forum.fid = lfx_forum_posts.parent_forum
    GROUP BY lfx_forum.fid
    ORDER BY lfx_forum.fid ASC

Это получает последнее сообщение на каждом форуме и дает мне краткий обзор, проблема в том, что

lfx_forum_posts.pid = 
                    (SELECT MAX(lfx_forum_posts.pid)
                    FROM lfx_forum_posts
                    WHERE lfx_forum_posts.parent_forum = lfx_forum.fid
                    GROUP BY lfx_forum_posts.parent_forum)

Заставляет мой COUNT (lfx_forum_posts.pid) переходить на один (а также COUNT (lfx_forum_threads.tid), что не так, как я хотел бы, чтобы он работал. Мой вопрос: есть ли какой-нибудь простой способ заставить его показать правильный номер и в то же время получить правильную информацию о сообщении (самое последнее)?

Если что-то неясно, скажите, и я попытаюсь объяснить мою проблему дальше, я впервые публикую что-то здесь.

Ответы [ 3 ]

0 голосов
/ 23 декабря 2010

Просто добавьте столбец num_posts в свою таблицу.Не считайте сообщения с COUNT ().

0 голосов
/ 24 декабря 2010

Можем ли мы получить немного ...

Show Tables;
Desc Table lfx_forum_posts;
Desc Table lfx_forum_threads;
Desc Table lfx_forum_users;
Desc Table lfx_forum;

Вот какой-то псевдокод

select f.*, (select count(*) from forum_posts fp where fp.forum_id =  f.id) as num_posts,
(select count(*) from forum_threads ft where ft.forum_id =  f.id) as num_threads,
(select max(fp.id) from forum_posts fp  
where fp.id = f.id
) as latest_post_id,
from forums f;

Затем перейдите к использованию latest_post_id в отдельном запросе для получения его информации.

если ему не нравится использовать f перед объявлением, тогда создайте временную таблицу для этого, и вы будете обновлять каждый раз при выполнении запроса.

0 голосов
/ 23 декабря 2010

Трудно получить обзор структуры ваших таблиц только с одним таким большим запросом.Рассматривали ли вы создание представления, чтобы упростить и ускорить выполнение запроса?Почему вы должны держать его в одном запросе?Лично я считаю, что вы часто можете добиться как производительности, так и читабельности кода, разбивая слишком сложные запросы на несколько частей.

Но сложно получить обзор, поэтому не могу дать хороший ответ на ваш вопрос:)

...