Sieht aus wie Sie die order_products
in orders
zusammenfassen und dann das Ergebnis zusammenfassen.
würde ich dieses Konzept in der Abfrage wie folgt vor:
SELECT COUNT(*) tot_order,
SUM(os.total) total_amount,
SUM(os.o_prd_qty) prd_qty
FROM (
SELECT o.id,
o.total,
SUM(op.qty) o_prd_qty
FROM orders o
JOIN order_products op
ON op.order = o.id
WHERE o.order_date >= :start_date
AND o.order_date < :end_date + INTERVAL 1 DAY
GROUP BY o.id
) os
Wenn Sie die separate orders
mit ihren prd_qty
wollen laufen nur die innere Abfrage.
Ich habe auch Ihre Datumslogik korrigiert, so dass der Optimierer einen Index auf order_date
verwenden kann. Wenn Sie eine Spalte in einer Funktion auf einer Seite eines Vergleichs umbrechen, ist ein Index für diese Spalte normalerweise unbrauchbar.
Als eine Randnotiz würde ich einen langen Blick auf Ihre Namenskonvention werfen. Jeder hat seine Vorlieben, aber Sie sollten sich mit diesen Fragen in Einklang stehen:
- abkürzen?-
tot
, total
, prd
, product
, qty
- append
_id
für Fremdschlüssel? - order_products.order
, order_products.product_id
- Tabellenname in Spalten einschließen?-
orders.total
, orders.order_date
eine Konvention Nach macht Ihre Datenbank viel einfacher zu navigieren und zu arbeiten. Sonst ist es beim Schreiben jeder Abfrage wieder beim Schema!
Ich persönlich im Allgemeinen nicht abkürzen, fügen Sie die _id
anhängen und nicht den Tabellennamen in Spalten enthalten.