SQL多表关联实战:如何使用一条sql语句查询两张弱连接的表

SQL多表关联实战:如何使用一条sql语句查询两张弱连接的表

工地项目

页面是省级工地分布图,显示一个省所有的工地,需要标注出工地的经纬度,以及该工地是否已经安装了摄像头

向前端提供工地数据的同时,需要额外加一个字段表示该工地是否有摄像头,0:表示没有,1:表示有;

要求
工地表没有没有摄像头ID,摄像头表有工地ID,如果该工地已开通摄像头,则会在摄像头表对应的一条数据中存入工地ID

工地信息表:

在这里插入图片描述

摄像头表:

在这里插入图片描述

问:

  1. 已开通摄像头的工地信息;
  2. 未开通摄像头的工地信息;
  3. .全部工地的摄像头信息,
    注:返回信息中加一个字段,以此表明哪些工地开通摄像头,哪些没有开通,不可改动数据库表

SQL语句:

SELECT
t1.site_id,
t1.site_name,
t1.site_longitude,
t1.site_latitude,
if(COUNT(t2.site_id)>0, 1, 0) as hasCamera
FROM biz_construction_site t1
LEFT JOIN biz_camera t2
ON
t1.site_id = t2.site_id
GROUP BY t1.site_id
HAVING COUNT(t2.site_id) > 0

将工地表biz_construction_site左连接摄像头表biz_camera,使用两张表唯一的关联工地ID作为连接条件,这样就能得到同一个工地的工地信息和摄像头信息;

使用工地表的id对查询的数据进行分组,HAVING 的作用相当于whereCOUNT则是统计,统计t2.site_id的数量,最后两行一起就是以工地表的工地id进行分组,然后统计每组中摄像头表中的工地id数量,数量大于0作为 HAVING过滤条件,然后在 if中判断:
if(COUNT(t2.site_id)>0, 1, 0) as hasCamera的意思是,如果每组摄像头表中的工地id大于0,就将1赋值给hasCamera,否则就是0;
SQL HAVING 子句

这样就可以通过一条语句实现我们所需要的数据,我最早想到的一条sql的方法是嵌套语句,将其中一张表的工地id求出来,然后使用NOT IN进行排除,之所以不用IN,是因为SQL语句本身的短板,使用a IN (?,?,?)的时候,如果第一个参数和a相同,那后面的就不会在进行排查,但是这样有一个问题就是,每一次都将一张表的工地id查出来,随着数据越来越庞大,很影响性能,所以得到了第二条语句

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值