Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL左连接、内连接等,复杂查询,PHP+MySQL论坛_Php_Mysql_Forum - Fatal编程技术网

MySQL左连接、内连接等,复杂查询,PHP+MySQL论坛

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

所以我有一个小论坛,我正试图获取数据,有4个表,论坛,论坛帖子,论坛线程和用户。我想做的是获取每个论坛的最新帖子,并让用户对该帖子有一个粗略的了解,我也想获得每个论坛的帖子数量和线程数量。另外,我想在一个查询中实现这一点。下面是我的想法:

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?