Autor | Zpráva | ||
---|---|---|---|
Toník Profil * |
Zdravím,
mám takový problém, přemýšlím nad co nejefektivnějším SQL pro získání skladu produktu za dané období. Ono to funguje, jen pokud produkt nemá varianty (a nevím, jak bych to do SQL zařadil) SELECT product.id, lang.name, (SELECT SUM(orderpr.count) FROM web_order ord LEFT JOIN web_order_products orderpr ON orderpr.order_id=ord.id WHERE ord.order_type!='storno' AND (orderpr.product_id=product.id OR orderpr.product_id=product.parent_id) AND ord.date>={$this->minMonth} AND ord.date<={$this->maxMonth} ) as countOrder, (SELECT SUM(orderpr.product_price * orderpr.count) FROM web_order ord LEFT JOIN web_order_products orderpr ON orderpr.order_id=ord.id WHERE ord.order_type!='storno' AND (orderpr.product_id=product.id OR orderpr.product_id=product.parent_id) AND ord.date>={$this->minMonth} AND ord.date<={$this->maxMonth} ) as countPrice FROM web_products product LEFT JOIN web_products_lang lang ON product.id=lang.product_id WHERE lang.lang_id=1 AND product.del=0 AND parent_id=0 countOrder => počet objednávek countPrice => celková suma objednávek where => lang=1 (čeština), del=0 = aktivní produkt, parent_id=0 = pouze hlavní produkty tabulky jsou web_products (id, parent_id...) web_products_lang (id, product_id, lang_id, name...) web_orders (id, date...) web_orders_products (id, product_id, product_price, count) jenže, jakmile pustím " AND (orderpr.product_id=product.id OR orderpr.product_id=product.parent_id)" tak je mi jasné, že to fungovat nebude, protože vytahuji v pr. pouze hlavní produkty PS - Myslíte, že jdou ty první 2 SQL sjednotit (ty selecty SUM?) Moc díky za pomoc |
||
Kajman Profil |
#2 · Zasláno: 28. 4. 2021, 21:12:56
Když budete joinovat výsledky (něco jako Optimalizace SQL dotazu), tak tam můžete mít více sloupců vypočtených agregačními funkcemi.
|
||
Toník Profil * |
#3 · Zasláno: 29. 4. 2021, 09:06:12
Pravda, to mě nenapadlo, že to je vlastně stejné.
Díky za radu! |
||
Toník Profil * |
#4 · Zasláno: 29. 4. 2021, 10:23:53
Mohu ještě mít prosím dotaz - chtěl bych ještě zvlášť vypsat varianty (počet objednávek + cena za dané období):
takto mi to zobrazí soupis variant, ale pouze u jedné z nich uvede countOrder a countPrice, ostatní mají NULL. A u té, u které je to uvedeno, to má celkový součet všech variant. 1584 = test ID hlavniho produktu, ktery ma 4 varianty SELECT p.id, prl.name, dataVariant.* FROM shop_products p LEFT JOIN (SELECT op.product_id id, COUNT(obj.id) countOrder, SUM(op.product_price * op.count) countPrice FROM shop_order obj JOIN shop_order_products op ON op.order_id = obj.id JOIN shop_products pr ON op.product_id = pr.id WHERE pr.parent_id=1584 AND obj.order_type!='storno' AND obj.date>={$this->minMonth} AND obj.date<={$this->maxMonth} ) as dataVariant ON p.id=dataVariant.id JOIN shop_products_lang prl ON p.id = prl.product_id WHERE prl.lang_id=1 AND p.parent_id=1584 ORDER BY p.id DESC Díky za radu |
||
Kajman Profil |
#5 · Zasláno: 29. 4. 2021, 10:58:23
V poddotaze chybí přece
GROUP BY op.product_id id
Když byste měl přísně nastavený server (na vývoj doporučuji), tak by takový dotaz ani neprošel. |
||
Časová prodleva: 4 roky
|
0