MySQL左连接、内连接等,复杂查询,PHP+MySQL论坛
所以我有一个小论坛,我正试图获取数据,有4个表,论坛,论坛帖子,论坛线程和用户。我想做的是获取每个论坛的最新帖子,并让用户对该帖子有一个粗略的了解,我也想获得每个论坛的帖子数量和线程数量。另外,我想在一个查询中实现这一点。下面是我的想法:MySQL左连接、内连接等,复杂查询,PHP+MySQL论坛,php,mysql,forum,Php,Mysql,Forum,所以我有一个小论坛,我正试图获取数据,有4个表,论坛,论坛帖子,论坛线程和用户。我想做的是获取每个论坛的最新帖子,并让用户对该帖子有一个粗略的了解,我也想获得每个论坛的帖子数量和线程数量。另外,我想在一个查询中实现这一点。下面是我的想法: SELECT lfx_forum_posts.*, lfx_forum.*, COUNT(lfx_forum_posts.pid) as posts_count, lfx_users.username, lfx_users.uid, l
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)
使我的COUNTlfx_forum_posts.pid和COUNTlfx_forum_threads.tid都变成一个,这不是我想要的工作方式。我的问题是:是否有一些简单的方法可以让它显示正确的数字,同时获取正确的帖子信息,即最新的帖子信息
如果有什么不清楚的地方,请告诉我,我会尝试进一步解释我的问题,这是我第一次在这里发布内容。只有一个这样的大查询,很难获得表结构的概述。 您是否考虑过创建一个视图以使运行查询更容易、更快? 为什么要在一个查询中保留它?我个人发现,通过将过于复杂的查询拆分为更多部分,通常可以获得性能和代码可读性 但是很难得到一个概述,所以不能真正给你的问题一个好的答案:只需将num_posts列添加到表中即可。不要用count来计数帖子。我们能得到一些
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;
然后继续在一个单独的查询中使用最新的post id来获取它的信息
如果它不喜欢在声明f之前使用f,那么为它创建一个临时表,然后每次运行查询时都会进行更新。什么是视图,我可以在phpmyadmin中创建它,或者我如何使用mysql提示符来实现它?我的想法是,如果我不能在一个或两个查询中完成,我将不得不在所有数据上执行大量foreach循环,而这正是我之前所做的。我希望一个大的查询能够更快,因为mysql可以做一些优化之类的事情?如果我使用两个查询和一个foreach循环,我会注意到速度上的巨大差异吗?提前谢谢!视图是基于一个或多个表的数据的虚拟表。这样,如果您有多个具有不同数据的表,则可以创建一个视图来保存每行所需的数据。然后可以查询视图而不是原始表。在这里找到了一个关于它的教程谢谢,我会努力研究的!现在,我通过部分使用这个查询和添加num_帖子(正如oyatek所说)对它进行了排序。我是否应该将它添加到我的论坛表中,然后从那里选择它,然后每次添加帖子时更新它?为什么计数不好?1从id=25的论坛中选择num_帖子比从id=25的论坛中选择num_帖子快2更容易阅读-只需选择一列,无需编写过多代码。。。我总是使用用户列num\u。。。而不是在可能的时候数数。是的,只要将此列添加到需要计数器的每个表中即可。你也可以添加触发器,你的计数器会自动递增。我真的没想过这样做,谢谢!只是想一想:当我处于小规模时,是否会像oyatek所说的那样更快,并且只去一个名为num_posts和num_threads的专栏?还是应该从一开始就使用count?