【一】介绍

在原生的sql中使用join 语法进行数据的联表查询,

在ThinkPHP里支持联表查询操作,但是可以归纳成两种方式:table方法、join方法

(1)table方法:在TP中对应SQL原型

原生PHP方法:通过where语法进行表1和表2的关联操作,即让两个表关联

select  表1.字段,表2.字段 [as 关联查询出的字段名] from  表1[as 别名1],表2[as 别名2]  where  表1.字段=表2.字段

ThinkPHP封装的方法:

$model->table();  //table方法是连贯操作中的一个辅助方法

(2)案例:查询每个职员的全部信息

分析:因为职员信息里,有一个dept_id字段,是部门表中的主键。所以此处应该读取出部门的名称。所以要求关联部门表,关联条件为职员表里的dept_id=部门表里的id

数据表:职员表sp_user、部门表sp_dept

主表和从表的确定:主表sp_user(别名t1)、从表sp_dept(别名t2)

语法:

select t1.*,t2.name as deptname from sp_user as t1,sp_dept as t2 where t1.dept_id=t2.id;

在Navicate中执行结果

将上述代码在TP中实现查询效果

①方法一:通过原生sql语句执行

//原生SQL方法实现联表查询
public function test(){
//实例化模型
$model = M();//执行原生sql语句可以不用关联表,因为sql里进行了关联
//定义sql语句
$sql="select t1.*,t2.name as deptname from sp_user as t1,sp_dept as t2 where t1.dept_id=t2.id;";
$result = $model -> query($sql);
dump($result);die;
}

这里输出联表查询结果,会输出

array(8) {
[0] => array(14) {
["id"] => string(1) "1"
["username"] => string(5) "admin"
["password"] => string(6) "123456"
["nickname"] => string(5) "admin"
["truename"] => string(9) "管理员"
["dept_id"] => string(1) "1"
["sex"] => string(3) "男"
["birthday"] => string(10) "2017-01-06"
["tel"] => string(5) "10000"
["email"] => string(9) "56@qq.com"
["remark"] => string(9) "石家庄"
["addtime"] => string(8) "12345678"
["role_id"] => string(1) "1"
["deptname"] => string(9) "人力部"
}
......
}

仔细观察,不难发现user表里面多了一个deptname的属性,说明职员表的dept_id为1时,对应部门表的id为1的人力部

②方法二:使用table方法实现

注意:在ThinkPHP里一般不建议使用原生SQL语句方法执行SQL

table语法:

$model->table('表名1[as 别名1],表名2[as 别名2]......');  //table方法是连贯操作中的一个辅助方法

在使用table方法之后模型会自动关联上table方法中指定的数据表,下面使用table方法改写之前原生SQL:

//table方法实现联表查询
public function test(){
//实例化模型
$model = M();//直接实例化父类即可,不需要关联数据表!!!
// 连贯操作,这里我为了好看(♥∀♥),将代码分行,分不分行都可以
$result = $model->field('t1.*,t2.name as deptname')
->table('sp_user as t1,sp_dept as t2')
->where('t1.dept_id = t2.id')
->select();
dump($result);die;
}

(2)join方法

JOIN方法也是连贯操作方法之一,用于根据两个或多个表中的列之间的关系,从这些表中查询数据。

join通常有下面几种类型,不同类型的join操作会影响返回的数据结果。

  • INNER JOIN: 等同于 JOIN(默认的JOIN类型),如果表中有至少一个匹配,则返回行
  • LEFT JOIN: 即使右表中没有匹配,也从左表返回所有的行
  • RIGHT JOIN: 即使左表中没有匹配,也从右表返回所有的行
  • FULL JOIN: 只要其中一个表中存在匹配,就返回行

常用类型:

INNER JOIN:内联;

LEFT JOIN(左外左主)和RIGHT JOIN(右外右主):外联;

在原生的SQL里join语法:

select 表1.字段,表2.字段 from 表1[as 别名1] [inner/left/right/full]join 表2[as 别名2] on 表1.字段=表2.字段; 

案例:查询部门详细信息,列出每一条部门信息中pid对应的部门名称。

分析:主表sp_dept(别名t1),从表sp_dept(别名t2)

条件:t1.pid = t2.id

①原生SQL方法:

select t1.*,t2.name as deptname from sp_dept as t1 left join sp_dept as t2 on t1.pid=t2.id;

Navicat执行结果:这里会显示上级部门,人力部为顶级部门pid为0,技术部归财务部管所以pid为2,财务部和外交部归人力部管所以pid为1

②ThinkPHP中执行join语法:

通过on进行关联,join方法也是连贯操作的辅助方法之一,且只有一个参数

$model->join('联表方式 join 表名[as 表名1] on 表1.字段=表2.字段');

如果需要给当前模型关联的表起别名,可以使用alias方法:

$model->alias('别名');//辅助方法之一
//jion方法实现联表查询
public function test(){
//实例化模型
$model = M('dept');//直接实例化父类即可,不需要关联数据表!!!
// select t1.*,t2.name as deptname from sp_dept as t1 left join sp_dept as t2 on t1.pid=t2.id;
$result = $model->field('t1.*,t2.name as deptname')->alias('t1')->join('left join sp_dept as t2 on t1.pid=t2.id')->select();
dump($result);
}

跟踪信息SQL语句:SELECT t1.*,t2.name as deptname FROM sp_dept t1 left join sp_dept as t2 on t1.pid=t2.id [ RunTime:0.0010s ]

浏览器输出:

array(4) {
[0] => array(6) {
["id"] => string(1) "2"
["name"] => string(9) "财务部"
["pid"] => string(1) "1"
["sort"] => string(2) "50"
["remark"] => string(18) "财务资源部门"
["deptname"] => string(9) "人力部"
}
......
}

注意:开发里会遇到一种关联情况,自己关联自己---自联查询

应用:一级导航和二级导航;省市县三级联动表;

ThinkPHP---TP功能类之联表查询的更多相关文章

  1. Spring Hibernate JPA 联表查询 复杂查询(转)

    今天刷网,才发现: 1)如果想用hibernate注解,是不是一定会用到jpa的? 是.如果hibernate认为jpa的注解够用,就直接用.否则会弄一个自己的出来作为补充. 2)jpa和hibern ...

  2. Spring Hibernate JPA 联表查询 复杂查询

    今天刷网,才发现: 1)如果想用hibernate注解,是不是一定会用到jpa的? 是.如果hibernate认为jpa的注解够用,就直接用.否则会弄一个自己的出来作为补充. 2)jpa和hibern ...

  3. MyBatis-Plus联表查询的短板,终于有一款工具补齐了

    原创:微信公众号 码农参上,欢迎分享,转载请保留出处. 哈喽大家好啊,我是Hydra. mybatis-plus作为mybatis的增强工具,它的出现极大的简化了开发中的数据库操作,但是长久以来,它的 ...

  4. .NET 6 跨服务器联表查询

    一.大家是否有这个需求 1.跨品种查询 :比如 MYSQL和一个SQLSERVER进行联表查询 ,或者SQLITE和MYSQL进行联表查询 2.跨服务器查询 : A服务器和B服务器查询 如果想同时支持 ...

  5. (转)MySQL联表查询

    资料源于网络   一.内联结.外联结.左联结.右联结的含义及区别在SQL标准中规划的(Join)联结大致分为下面四种:1.内联结:将两个表中存在联结关系的字段符合联结关系的那些记录形成记录集的联结.2 ...

  6. MyBatis联表查询

    MyBatis逆向工程主要用于单表操作,那么需要进行联表操作时,往往需要我们自己去写sql语句. 写sql语句之前,我们先修改一下实体类 Course.java: public class Cours ...

  7. Django之model联表:一对多、跨表操作,联表查询

    表结构概述 model.py : class Something(models.Model): name = models.CharField(max_length=32) class UserTyp ...

  8. yii学习笔记(7),数据库操作,联表查询

    在实际开发中,联表查询是很常见的,yii提供联表查询的方式 关系型数据表:一对一关系,一对多关系 实例: 文章表和文章分类表 一个文章对应一个分类 一个分类可以对应多个文章 文章表:article 文 ...

  9. mybatis 联表查询

    一.一对一关联 1.1.提出需求 根据班级id查询班级信息(带老师的信息) 1.2.创建表和数据 创建一张教师表和班级表,这里我们假设一个老师只负责教一个班,那么老师和班级之间的关系就是一种一对一的关 ...

随机推荐

  1. nyoj 739 笨蛋的难题四

    笨蛋难题四 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描写叙述 这些日子笨蛋一直研究股票,经过调研.最终发现xxx公司股票规律,更可喜的是 笨蛋推算出这家公司每天的股价, ...

  2. asp.net mvc 的 视图(view )的模块化开发

    目前所在项目有一个视图,几个模块都涉及到,对应不同的开发人员,虽然有SVN在管理,但代码冲突时有发生.并且大家的代码挤于其中,逻辑比较容易混乱. 将不同部件独立出去,实有必要. 分离方式,我知道的有 ...

  3. JS浮点数精度运算

    一般来讲,我们在项目中必不可少的需要进行各种数值的计算,但是这种计算全部放在服务端会给服务器带来很大的压力,所以势必要客户端来 分担一些计算的压力. 从客户端来说,JavaScript是一门弱类型语言 ...

  4. Helios Service Release 2安装SVN

    Eclipse Helios Service Release 2安装SVN地址:subclipse http://subclipse.tigris.org/update_1.6.x 1.使用方式:he ...

  5. html表格合并单元格

    th标签 合并列 colspan="k" 合并行 rowspan="k"   例子<th colspan="2", rowspan=& ...

  6. bzoj 1646: [Usaco2007 Open]Catch That Cow 抓住那只牛【bfs】

    满脑子dp简直魔性 模拟题意bfs转移即可 #include<iostream> #include<cstdio> #include<queue> using na ...

  7. Hadoop回收站及fs.trash参数详解

    前言: Linux系统里,个人觉得最大的不方便之一就是没有回收站的概念.rm -rf很容易造成极大的损失.而在Hadoop或者说HDFS里面,有trash(回收站)的概念,可以使得数据被误删以后,还可 ...

  8. HUE通过oozie工作流执行shell脚本

    HUE通过oozie工作流执行shell脚本 2018年01月17日 16:20:38 阅读数:217 首先上传对应的jar包和storm.sh脚本到hdfs,脚本内容如下: 脚本主要内容是:从hdf ...

  9. 基于itchat实现微信群消息同步机器人

    原始网址:http://www.jianshu.com/p/7aeadca0c9bd# 最近 全栈数据工程师养成攻略 的微信群已经将近500人,开了二群之后为了打通不同微信群之间的消息,花了点时间做了 ...

  10. Linux文件详解

    一.Linux文件类型分:普通文件.目录文件.链接文件.设备文件.管道文件. 1.普通文件:由ls -al显示属性时,第一个属性为 [-],例如 [-rwxrwxrwx].包括: 纯文本文件(ASCI ...