ei快乐小肥宅 2023-06-20 09:50 采纳率: 100%
浏览 24
已结题

mysql Left join查询结果 左侧表设置

问题:left join在以下两种情况下,为什么查询结果不同,左侧表什么时候需要加约束条件呢,这两种情况是不是用inner join更好呢?谢谢!

情况一: 为什么没有对a表做条件约束,就能实现筛选目标?

-- gct(table_id) 👉 data_resource_table(res_id,table_id) 👉 data_resource(res_id,cata_id)
-- 想查询gct表中table_id 对应的cata_id值 (134条)
select a.cata_id , a.res_name , b.table_name
from data_resource a left join data_resource_table b on a.res_id = b.res_id
where b.table_id in (select table_id from gct)
ORDER BY cata_id;
-- 这个语句使用left join 和 inner join 查询结果一致 都是恰好134条

情况二: 如果不对a表做约束,会显示一千多条数据,必须交换AB表位置,或者使用inner join,才能显示正确结果

-- gcxy2表有134条数据
SELECT a.cata_id , a.status 
from data_catalog a left join gcxy2 b on a.cata_id = b.cata_id
-- where a.cata_id in (SELECT cata_id from gcxy2)   限制句加上才对,不加就显示1千多条
ORDER BY a.cata_id;
  • 写回答

3条回答 默认 最新

  • zhangpan_soft 2023-06-20 14:16
    关注

    这个问题是这样的, 首先你要理解什么是left join , 什么是right join, 什么是 inner join

    left join, 左连接, 表示: 左表数据为准和右表进行连接, 不论右表是否有对应数据. 这叫左连接, 也就是说: 如果左表有条id为1的数据,而右表没有, 此时这条数据依然会显示出来, 只不过右表部分显示的全是null, 你用 select * from a left join b on a.id = b.id 即可看出来

    rigth join, 右连接, 表示: 正好和左连接相反, 即上述的左表换成右表, 右表换成左表即可

    inner join, 自连接, 表示: 以左右表数据为准, 进行表连接. 因此: 在inner join下, 左表和右表必须都有数据对应, 否则无法连接.

    这就是你上述的问题, 因为你使用左连接时, 假如是1对1关系,即左表1条数据在右表最大只有1条数据对应(可以没有), 此时结果永远是左表数据行, 即左表有多少数据, 则左连接有多少数据, 这就是你的问题.

    当你上述换成右连接时, 正好反过来, 是右表的数据, 即右表有多少数据, 结果就有多少, 但是此时左表数据可能为null, 显然结果也是不正确的.

    因此: 你上述的结果应该使用自连接即(inner join), 此时会筛选出相关联的数据.

    希望关注和采纳谢谢!!!

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 6月29日
  • 已采纳回答 6月21日
  • 创建了问题 6月20日

悬赏问题

  • ¥15 fcloudflare域名已经用了一年了,突然之间finalshell证书签发错误怎么解决
  • ¥15 近端策略优化 PPO | 损失值计算问题
  • ¥20 高通移动端,安卓12,如何让wifi无视国家码启动6Gwifi,重新开机无需干涉自动连接
  • ¥15 Hadoop实训论文成品! 任意标题 价格可私 急
  • ¥15 程序实在不会写,要秃了
  • ¥15 pycharm导入不了自己的包
  • ¥15 本人本科机械,目前研一。没有深度学习基础,目前对研究生课题一片迷茫,请教各位!
  • ¥15 关于R语言单因素与多因素线性回归的平均值
  • ¥15 服务器清除BIOS之后引导不了
  • ¥15 CPLEX用OPL编写的混合整数线性优化问题。