记录Thinkphp中的多表查询写法
  • 2020-06-16


前言

我的sevebot后台可以根据数据表生成菜单与api,这样可以让用户减少写代码的次数。

最近RY给了我一份图书管理系统的数据库,十分钟内我生成了一个后台管理系统。



但是弊端是有的,RY在借阅书籍状态中配置了外键,使得我浏览数据的时候借阅的书籍显示的是图书编号。



为了解决这个问题必须配置多表查询。

基本信息

借阅图书状态表:book_borrow
借阅人名单表:borrower
图书表:book

需要实现:

根据借阅图书状态表中的借书人id字段去检索借书人表中id相等的值并赋予虚拟字段borrowername。
根据借阅图书状态表中的图书id字段去图书表中id相等的值并赋予虚拟字段bookname。

逻辑:


通过book_borrow表中的借阅书籍字段(bookid),通过这个id查询book表,当book_borrow.bookid=book.id时,获取其book.title字段内容并赋予虚拟字段book_borrow.bookname。


通过book_borrow表中的借阅人字段(borrid),通过这个id检索borrower表,当book_borrow.borrid=borrower.id时候,获取borrower.name并赋予虚拟字段 book_borrow.borrowername。

实现的sql语句:

select a.*,b.title as bookname,c.name as borrowername from book_borrow as a inner join book as b inner join borrower as c on a.bookid = b.id and a.borrid = c.id

sql语句释义

其实一开始我也不懂 看了一个例子反复思考才明白

例子:

select a.*,b.class_name,c.title as supplier_name from cd_goods as a (inner join) cd_goods_cata as b (inner join) cd_supplier as c on a.goods_cata_id = b.goods_cata_id and a.id = c.id

分类名称的表 cd_goods_cata 分类名称字段 class_name 编号字段 goods_cata_id

商品管理的表 cd_goods 商品名称字段 title 所属分类(id) goods_cata_id所属分类(虚拟) class_name 所属供应商(虚拟) supplier_name

供应商表 supplier 供应商名称 title

逻辑 :

在商品管理表的字段中 把字段class_name 和 supplier_name 显示分类表中的 class_name 和供应商表的 title


第一块

select a.*,b.class_name,c.title as supplier_name

释义:

查出a表的所有字段值并赋予设置多表查询的方法的当前表同名字段
查出b表的class_name 字段值并赋予当前操作表的class_name字段
查出c表的title值 并赋予当前操作表的supplier_name字段

第二块

from

数据来源连接词

第三块

cd_goods as a (inner join) cd_goods_cata as b (inner join) cd_supplier as c


释义:

inner join 为内连接词 ,把cd_goods表当做a cd_goods_cata 表当做b cd_supplier当做c  这样可以减少后续写法

第三块

on

条件连接词

第四块

a.goods_cata_id = b.goods_cata_id and a.id = c.id

释义:

当a表的goods_cata_id字段内容 与 b表的goods_cata_id字段内容一致 并且 a表的id与c表的id值相同

总结

这里总的理解为 我把商品管理当成a表 商品分类为b表 供应商为c表

我从商品管理表的商品分类id 去和 商品分类表的商品分类id比较 此时可以得到一条来自b表的记录

然后b表记录的class_name被赋予给当前表名为class_name的字段

然后 比较a.id 也就是从 商品表的隐藏字段 商户id 去和 商户的id作比较

一致得到一条来自c表的记录 将c表的title赋值给当前表的supplier_name值

多表查询完成