找回密码
 立即注册
搜索

途迹耕耘

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

GMT+8, 2025-12-22 05:39 , Processed in 0.086305 second(s), 14 queries .

[DZ教程] discuz 关于多数据表联合查询的代码

[复制链接]
bdk 发表于 2020-5-2 07:20:22 | 显示全部楼层 |阅读模式
很多时候一篇文章/帖子或者什么其他内容,可能单独查询一个表并不能满足需要,如果涉及的表较多,综合起来查询是比较方便的。
下面以查询帖子列表为例:
  1. DB::query("SELECT t.*,p.message,p.pid,f.name FROM ".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 WHERE t.`fid` in ($fids) and t.displayorder>=0 and p.first=1 group by t.tid ORDER BY t.`dateline` DESC LIMIT 0 , 10");
复制代码
说明:
其中SELECT之后t.xxx p.xxx f.xxx,前面的字母代表的是多个表,几个不重复字母代表几个表,t、p、f在每个.DB::table("forum_thread")之后都会跟个字母,这些代表表的字母之后跟的*代表所有字段,跟哪个字段就调用哪个字段。

LEFT JOIN 正式解释是从左边表那里返回所有的行。实际上是LEFT JOIN之后写的表供前面写的“t.xxx p.xxx f.xxx”所列字段查询,FROM ".DB::table("forum_thread")." t,最后的t就代表此表,也就是此联合查询中第1个表,接下来LEFT JOIN ".DB::table("forum_post")." p on p.tid=t.tid查询第2个表,p即代表此表,关联条件是此表的tid等于第1个表的tid,接着还有LEFT JOIN ".DB::table("forum_forum")." f on f.fid=t.fid查询第3个表,f即代表此表,关联条件是此表的fid等于第1个表的fid。

然后就是限定条件WHERE t.`fid` in ($fids) and t.displayorder>=0 and p.first=1,其中t.`fid` in ($fids) 即为第一个表的fid来自变量$fids,t.displayorder>=0即第一个表中displayorder字段值为正常帖子(-1回收站,-2待审核,-4草稿箱),p.first=1即第2个表中first字段为主题帖(0为回复帖),group by t.tid根据第1个表tid列对结果集进行分组,ORDER BY t.`dateline` DESC LIMIT 0 , 10根据第1个表的dateline字段倒序排序,取前10条。

---------本文为php和mysql小白自己理解的,可能会有描述不当之处,故仅供参考,敬请谅解!-----------