MySQL多张表关联查询

工作中遇到的问题,其实也不算难,最多算是复杂了一丢丢。有四张表,A,B,C,D;
假设:
A:商户表,有字段code;
B:商户普通用户表,也有字段code;ps:code是关联着三张表的重要字段;
C:商户会员表,没有与其关联的code,但是有card_code字段与D表中的card_code关联;
D:会员卡表;
A表

B表

这里写图片描述

D表

当然,每张表的字段绝对不止这些!
目的是查找到推荐商户,就是is_recommend字段标识的商户,并且要查出他的普通用户与会员所享有的折扣率,即是discount_rate字段;但是其中会员的折扣信息在D表会员卡表中;并且有些会员已经不享受折扣(status标识)。

1.要查找出所有推荐商户,无论其折扣是否存在,都要把商户name,shop_type等有用信息查找出来;
2.一次性查出所有信息。
刚开始没有注意到无论折扣信息是否存在,都需要查出shop信息的条件,所以SQL是这么写的:

select a.code,a.name,a.shop_type,b.discount_rate as b_rate,d.discount_rate as d_rate  from A a,B b,C c,D d where a.code=b.shop_code and a.code=c.shop_code and c.card_code=d.card_code and a.is_recommend='Y' and b.status!='N' and c.status!='N' ;

执行后发现,根本不是自己想要的数据!当折扣信息不存在的时候,所查询的商户信息也就不存在了!

接下来,就想到了表连接;以A表为基准,这样查出来的数据无论有没有折扣信息,商户信息都会查出来:

select a.code,a.name,a.shop_type,b.discount_rate as b_rate,d.discount_rate as d_rate  from A a left join B b on a.code=b.shop_code left join (C c left join D d on c.card_code=d.card_code) on a.code=c.shop_code where a.is_recommend='Y' and b.status!='N' and c.status!='N' ;

完成后,欣喜若狂!然而打击又来了,在不加where条件的时候,结果还是我预期的,当加上where条件,则:和刚开始写的SQL出现一样的问题,该出现的商户信息消失了!真是百思不得其解!

最后,感觉where条件应该加在left join … on 的后边,即是:

select a.code,a.name,a.shop_type,b.discount_rate as b_rate,d.discount_rate as d_rate  from A a left join B b on a.code=b.shop_code and b.status='Y' left join (C c left join D d on c.card_code=d.card_code and c.status!='N') on a.code=c.shop_code where a.is_recommend='Y';

最终版本就是这样。我相信这肯定不是最优的SQL代码,学无止境!共同进步!更像引用一句前辈的话:理论不懂就实践,实践不会就学理论!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值