select distinct brands.*
from product_prices
inner join products on products.id = product_prices.product_id
inner join brands on brands.id = products.brand_id
inner join quotation_batches on product_prices.batch_id = quotation_batches.id
where
(quotation_batches.id =76897 OR quotation_batches.group_id =76897)
and products.publish_stage IN (0,1)
and brands.status NOT IN (1,2)
首先粗略猜测一下表名整理关系:
产品(products),都有一个品牌(brands),每个产品都会有多个报价(product_prices),每个批次(quotation_batches)也都会有对应的多个报价(这个关系稍微复杂一点)
对应到数据量其实就比较明朗了,数据最小的应该是品牌brands,可能会有10w的数据,品牌对应的产品products可能就要乘个10,就算100w好了,product_prices应该会有1000w,批次quotation_batches跟产品products没有直接关系,而一个quotation_batch也会对应多个product_prices,批次的数据跟products差不多,也算100w好了
数据大小我们也有底了:brands(10w),products(100w),quotation_batches(100w),product_prices(1000w)
分析一下sql的目的:找出符合条件的品牌(brands)
条件:某批次或者某一组批次的 且 产品阶段在xx范围 且 产品品牌状态不在xx范围
分析一下这句sql的逻辑: 通过产品价格找到产品,再找产品的品牌,再通过批次报价找到批次……
以上分析完毕,开始修改
<pre>
最终需要找到brands,数据表不大,最终结果去distinct不会太耗资源
select distinct brands.*
以能找出数据最少的表为主表
from quotation_batches
通过批次找到批次价格(保证这个大家伙是被join的)
INNER JOIN product_prices
ON product_prices.batch_id = quotation_batches.id
通过产品价格的产品id找到产品
INNER JOIN products
ON products.id = product_prices.product_id
找到品牌
INNER JOIN brands
ON products.brand_id = brands.id
where
(quotation_batches.id =76897 OR quotation_batches.group_id =76897)
and products.publish_stage IN (0,1)
最好改成in(x,x,x,x)
and brands.status NOT IN (1,2)
</pre>