首先总结一下单表单数据和单表多数据 单表单数据,查询时用:result_first 单表多数据、多表多数据,查询时用:fetch_all 这个在 《[Discuz 模板数据查询详解](https://www.688576.com/article-14.html "Discuz 模板数据查询详解")》 这篇教程里已经写的很详细了。不懂的反复阅读, 这里重点要讲的是多表多数据联合查询的逻辑。我们以下图为例。讲解如何实现多表多数据的联合查询 ![](/uploads/attachment/1/202209/02/6ad1a1d79ad0b9c04575d60461262042.png) 可以看出这一块区域,涉及查询的东西还是比较多的。包含了有版块的forum_thread表、附件封面的forum_threadimage表、主题内容的forum_post表、所在版块的forum_forum表。 这里为什么一定要强调这个逻辑呢。因为在查询过程中,只有逻辑通顺了,才能查询的出我们最终想要的结果,那么我们就要遵循这个逻辑顺序。 以上图为例, 首先,我们要先确认我们在这个区域,最终要展示出来的是什么。是主题?是内容?是会员?还是图片?其实不管是图片也好,内容也好这一切都属于在主题的范畴内,换句话说,我们这一片的区域,最终调取的还是主题。那么,我们接下来的调取数据,肯定就要以主题为核心了。 既然有了核心,我们就先将核心调取出来。也就有了 ```php $thread_list = DB::fetch_all("SELECT * FORM ".DB::table("forum_thread")." order BY dateline desc limit 0,10"); ``` 现在我们已经实现了基础的查询出最新的10个主题的标题、fid、tid、作者、作者UID、发表时间、查看数、回复数、支持数. 因为这个表中需要用到的字段比较多,所以在查询的时候,用到了通配符 * 。代表了这里 SELECT 了所有的字段都可以拿出来用。 有了前面的基础,后面我们就可以把剩余的表一个一个的加进来了。接下来我们就需要获得这个主题的内容,内容在forum_post 这个表里,那么就需要在上面的基础上关联forum_post 其中 forum_post 为了可以与 forum_thread 表关联,这里用了2个表中都存在的tid做关联。 ```php $thread_list = DB::fetch_all("SELECT t.*,p.message FORM ".DB::table("forum_thread")." t left join ".DB::table("forum_post")." p on p.tid=t.tid order BY t.dateline desc limit 0,10"); ``` 为了方便预览,这里将每一个关联的表切成一行。 再往下,我们参照上图中的查询,还要查出forum_forum表中的版块名称 其中 forum_forum 为了可以与 forum_thread 表关联,这里用了2个表中都存在的fid做关联。 ```php $thread_list = DB::fetch_all("SELECT t.*,p.message,f.name FORM ".DB::table("forum_thread")." t left join ".DB::table("forum_post")." p on p.tid=t.tid left join ".DB::table("forum_forum")." f on f.fid=t.fid order BY t.dateline desc limit 0,10"); ``` 最后,就是图片附件了。也就是封面图片。这个是在表 forum_threadimage 中, 其中 forum_threadimage 为了可以与 forum_thread 表关联,这里用了2个表中都存在的tid做关联。 ```php $thread_list = DB::fetch_all("SELECT t.*,p.message,f.name,i.attachment as forum_pic FORM ".DB::table("forum_thread")." t left join ".DB::table("forum_post")." p on p.tid=t.tid left join ".DB::table("forum_forum")." f on f.fid=t.fid left join ".DB::table("forum_threadimage")." i on i.tid=t.tid order BY t.dateline desc limit 0,10"); ``` 至此,联合查询的逻辑就这么一步步出来了。我们再来看一下,可以很清晰的看出来 - t 代表了表 forum_thread,$thread_list 变量中可以调取出该表所有字段。 - f 代表了表 forum_forum,$thread_list 变量中可以调取出name,表示的是当前主题所在版块的版块名称。 - p 代表了表 forum_post,$thread_list 变量中可以调取出message,表示的是当前主题的主题内容。 - i 代表了表 forum_threadimage,$thread_list 变量中可以调取出attachment,但这里将其改名为forum_pic,表示的是当前主题的封面图片。