最近几天也是苦于多张表联合查询的问题,因为涉及的表比较多,表之间的主键外键的关联关系也容易搞错,所以今天总计一下这几天遇到的问题和解决方法。
我用到的有内连接查询和左外连接查询,在这里我是用的项目里正在用的数据库,会尽可能简单明了。
话不多说上代码。
1、普通单表查询:
sql语法:select 列名1,列名2... from 表 where条件语句;
select tour_id,tour_groupno from tour_group where tour_start between '2019-09-26' and '2019-09-26'
2、两个表联合查询(inner join):
sqly语法:SELECT 列名1,列名2… FROM 表1 INNER JOIN 表2 ON 表1.外键=表2.主键 Where 条件语句;
select p.tour_id,p.tour_groupno,l.tour_gid,l.tour_ysmoney from tour_group p inner join tour_groupcompanybill l on p.tour_id=l.tour_gid where tour_start between '2019-09-26' and '2019-09-26'
3、三张表联合查询(inner join):
其实你会发现两张表和多张表联合查询区别并不大,3张表已上的查询也适用于此方法。
我先给大家看内连接inner join的效果:
select p.tour_id,p.tour_groupno,l.tour_gid,l.tour_ysmoney,h.tour_date
from tour_group p
inner join tour_groupcompanybill l on p.tour_id=l.tour_gid
inner join tour_groupsearch h on h.tour_id=p.tour_id
where tour_start between '2019-09-26' and '2019-09-26'
4、三个表联合查询(left join):
注意:左连接是以左表为标准,主要查询在左边表中存在的数据,不符合条件的会以 null 进行填充。
所以,大家进行多表联合查询的时候一定要分清哪个是主表。
select p.tour_id,p.tour_groupno,l.tour_gid,l.tour_ysmoney,h.tour_date
from tour_group p
left join tour_groupcompanybill l on p.tour_id=l.tour_gid
left join tour_groupsearch h on h.tour_id=p.tour_id
where tour_start between '2019-09-26' and '2019-09-26'
神奇的事情来了,大家看下inner join内连接和left join左外连接查询的区别:
大家注意下,在实际查询中到底以哪张表为主连接表是关系到查询结果的,仔细一点是没有什么问题的。
大家在查询表的时候,可能遇到数据库表里显示的是数字,而项目要求显示出来是汉字或者其他代表性的标识之类的情况,
在这分享下我的做法。
select
p.tour_id,p.tour_groupno,l.tour_gid,l.tour_ysmoney,h.tour_date,
(CASE h.tour_type WHEN 0 THEN '云南' WHEN 1 THEN '泰国' WHEN 2 THEN '贵州' ELSE 'null' END) as tour_type
from
tour_group p
inner join tour_groupcompanybill l on p.tour_id=l.tour_gid
inner join tour_groupsearch h on h.tour_id=p.tour_id
where tour_start between '2019-09-26' and '2019-09-26'
大家可以看到,表里tour_type字段是用0,1,2...来表示的,而老板要求显示成文字,所以我采用了这种方法来处理。
当然还有其他方法来处理这种情况,比如枚举类,在这里不作过多解释,有空再分享出来。
今天的分享希望能帮到各位。