mysql - efficient join needed against a virtual table used multiple times in a subquery -
i trying run query similar one:
select s.custno, s.prodno, if(daycode = 1, (select avg(sell) sales ss join (select distinct `prodno` `familycode` prodfamily = 101) f2 on f2.prodno = ss.prodno ss.custno = 800 , ss.weekno = s.weekno - 1), (select avg(sell) sales ss join (select distinct `prodno` `familycode` prodfam = 101) f3 on f3.prodno = ss.prodno ss.custno = 800 , ss.weekno = s.weekno)) weekavg sales s join product p on p.prodno = s.prodno join (select distinct `prodno` `familycode` prodfamily = 101) f on f.prodno = s.prodno s.custno = 800 order ardate8n asc, s.custno, s.prodno in query products week average based on daycode param product family.
a product belongs product family.
- if daycode = 1 want same product family average of previous week.
- else want average on current week same product family.
as see f,f2,f3 similar virtual tables, helps link against existing products based on product family.
how query rewritten not compute f2, f3 tables, slow process.
i don't have mysql environment available me atm, memory , not run against mocked tables.
first, try stick joins, filtering done against familycode 'distinct' marker. not know data in familycode, compare working slow query new 1 , watch 'sales spike' duplicates!
from sales ss join (select distinct `prodno` `familycode` prodfamily = 101) f2 on f2.prodno = ss.prodno ss.custno = 800 becomes
sales ss join familycode f2 on f2.prodno = ss.prodno ss.custno = 800 , f2.prodfamily = 101 my second approach, , if duplicates sales spike issue, try 'exists' clause instead of 'distinct' clause. solution this:
from sales ss join familycode f2 on f2.prodno = ss.prodno ss.custno = 800 , exists (select 1 familycode f2 f2.prodno = ss.prodno , f2.prodfamily= 101)
Comments
Post a Comment