2016-04-22 12 views
-1

Dies ist meine TabellenMysql erhalten SUM und COUNT Wert von zwei Tabellen

Tabelle 1: Aufträge

id total order_date 
1 200 2016-04-22 
2 300 2016-04-22 

Tabelle 2: order_products

id order product_id qty 
    1 1  1  2 
    2 1  2  1 
    3 2  2  2 
    4 2  1  2 

Und mein Ergebnis sollte be

und meine Frage ist

SELECT COUNT(ddo.id) AS tot_order, 
      SUM(ddo.total) AS total_amount, 
      (SELECT SUM(dop.qty) 
      FROM order_products dop 
      WHERE dop.order=ddo.id) AS prd_qty 
    FROM orders ddo 
    WHERE DATE(ddo.`order_date`) BETWEEN '2016-04-22' AND '2016-04-22' 

ich den total_order und TOTAL_AMOUNT bekommen kann, aber wie prd_qty zu bekommen?

Dank

Antwort

0

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.

1

Vielleicht fehlt Ihnen die GROUP BY Klausel

(SELECT SUM(dop.qty) FROM order_products dop WHERE dop.order=ddo.id GROUP BY dop.order) 
0

Sie Unterabfrage für die Berechnung prd_qty verwenden sollte:

für jeden Auftrag
SELECT SUM(dop.qty) as prd_qty, dop.order 
FROM order_products dop 
GROUP BY dop.order 

Es zählt prd_qty.
Und die vollständige Abfrage:

SELECT COUNT(ddo.id) AS tot_order, 
     SUM(ddo.total) AS total_amount, 
     sum(op.prd_qty) as prd_qty 
FROM orders ddo 
     JOIN 
     (
      SELECT SUM(dop.qty) as prd_qty, dop.order 
      FROM order_products dop 
      GROUP BY dop.order 
     ) as op ON (op.order = ddo.id) 
WHERE DATE(ddo.`order_date`) BETWEEN '2016-04-22' AND '2016-04-22' 
1

Diese Abfrage wird für Sie arbeiten.

SELECT COUNT(od.`id`) AS tot_order, SUM(od.`total`) AS total_amount, tablea.prd_qty 
FROM orders od JOIN (
       SELECT SUM(op.`prd_qty`) AS prd_qty 
       FROM orders od INNER JOIN order_products op 
       ON od.`id`=op.`order` 
       WHERE DATE(od.`order_date`) BETWEEN '2016-04-22' AND '2016-04-22' 
) tablea 
WHERE DATE(od.`order_date`) BETWEEN '2016-04-22' AND '2016-04-22' 

Um die prd_qty, erhalten Sie eine Unterabfrage ausführen muss ich nach join in den kleinen Klammern hinzugefügt.

0

Die einfachste Abfrage, um die Antworten zu erhalten wäre, wird dies als ein Messer durch die Butter arbeiten.

Allerdings wäre es noch schöner, wenn Sie einen Index für die Spaltenreihenfolge (ID) erstellen. Wenn es bereits eine Primärschlüsselspalte Indizierung ist nicht benötigt Indexierung nur, wenn Sie Ihre Daten glauben an höhere Zahl wird wachsen

select count(o.id) as tot_order , 
sum(o.total) as total_amount, 
(select sum(p.qty) from orders o join order_product p on o.id=p.order) as prd_qty  
from orders o; 
0

Dies sollte für Sie funktionieren.

select sum(order_id) orders, sum(total) total, sum(qty) prd_qty 
from (select count(o.id) order_id, sum(o.total) total, 
(select sum(qty) from order_products op where o.id = op.`order`) qty 
from orders o group by o.id) x; 

ziemlich einfach.