先看一段例子:
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 之后,就表示对整个数据做过滤,不管是否有匹配到。举个例子:
id | value | status |
1 | A | -1 |
2 | B | 1 |
3 | C | 1 |
4 | D | -1 |
id | value | master_value |
1 | 1 | A |
2 | 2 | A |
3 | 3 | A |
4 | 4 | B |
5 | 5 | B |
6 | 6 | B |
7 | 7 | C |
8 | 8 | C |
9 | 9 | C |
主表一有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。