关于LEFT JOIN的一次理解

先看一段例子:

SELECT
	product_half_spu.id AS 'halfSpuId',
	product_half_spu.half_spu_code,
	product_half_spu.half_spu_name,
	COUNT( product_sku.id ) AS 'skuCount',
	product_half_spu.create_on,
	product_half_spu.create_by,
	product_half_spu.upload_pic_date,
	product_half_spu.upload_pic_name,
	product_half_spu.pic_url,
	product_half_spu.pic_name,
	product_half_spu.category_product_id,
	category_product.ancestor 
FROM
	product_half_spu
	LEFT JOIN product_sku ON product_half_spu.id = product_sku.half_spu_id
	LEFT JOIN category_product ON product_half_spu.category_product_id = category_product.id 
WHERE
	product_half_spu.`status` = 1 
	AND product_sku.`status` = 1 
	AND category_product.`status` = 1 
	AND FIND_IN_SET( "1508", category_product.ancestor ) 
GROUP BY
	product_half_spu.id 
ORDER BY
	product_half_spu.create_on DESC

查询个数为40条

SELECT
	product_half_spu.id AS 'halfSpuId',
	product_half_spu.half_spu_code,
	product_half_spu.half_spu_name,
	COUNT( product_sku.id ) AS 'skuCount',
	product_half_spu.create_on,
	product_half_spu.create_by,
	product_half_spu.upload_pic_date,
	product_half_spu.upload_pic_name,
	product_half_spu.pic_url,
	product_half_spu.pic_name,
	product_half_spu.category_product_id,
	category_product.ancestor 
FROM
	product_half_spu
	LEFT JOIN product_sku ON ( product_half_spu.id = product_sku.half_spu_id AND product_sku.`status` = 1 )
	LEFT JOIN category_product ON ( product_half_spu.category_product_id = category_product.id AND category_product.`status` = 1 ) 
WHERE
	product_half_spu.`status` = 1 
	AND FIND_IN_SET( "1508", category_product.ancestor ) 
GROUP BY
	product_half_spu.id 
ORDER BY
	product_half_spu.create_on DESC

查询结果为44条。

可以看到这两条sql的区别就在于product_sku.`status` = 1和 category_product.`status` = 1的摆放位置。如果这两个条件,出现在where之前,就表示是对匹配到的数据做过滤。如果是放在where 之后,就表示对整个数据做过滤,不管是否有匹配到。举个例子:

idvaluestatus
1A-1
2B1
3C1
4D-1
idvaluemaster_value
11A
22A
33A
44B
55B
66B
77C
88C
99C

主表一有4条数据A、B、C和D,对象的子表二有如下对应关系:A -》1、2、3,B-》4、5、6,

c-》7、8、9,D没有对应的子表数据。并且A的status为-1,B的status的为1,C的status为1,D的status为-1。如果用刚才的sql去理解,如果条件放在了where之前,那么就是将匹配到了的数据进行过滤。这边匹配到的数据有A、B、和C,然后过滤status为-1之后,只剩下B和C,因为D没有匹配到数据,所以不参与过滤,所以最终剩下的结果就是A、B、D。而条件如果放到了where之后,那么过滤的逻辑就是直接过滤主表的数据,此时,A和D都会过滤,只剩下了B和C。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值