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
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 *
Pravda, to mě nenapadlo, že to je vlastně stejné.
Díky za radu!
Toník
Profil *
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
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.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0