2017-04-07 1 views
-1

ich arbeite an einem Projekt und ich habe diese SQL-Abfrage erstellt, aber es scheint zu lange dauern, wenn ich einen größeren Zeitraum auswählen, irgendeine Idee, wie es schneller zu machen, versuchte ich mit union all und seine viel schneller, aber die Daten ist nicht das gleiche, müssen mit dem Code helfen:mysql query dauert zu lang

SELECT SUM(ROUND(total, 2)) as Enero from (
    SELECT 
    FORMAT (
    COALESCE(
    CONCAT(ROUND(pro.precio/1.14 , 2) + ROUND(p.recargo/1.14 , 2) + (SELECT SUM(ROUND(precio/1.14 , 2)) AS precio FROM acompanante_orden WHERE id_orden=p.id_orden) - p.descuento), 
    CONCAT(ROUND(pro.precio/1.14 , 2) + ROUND(p.recargo/1.14 , 2) - p.descuento) 
    )+ COALESCE(

    ROUND(CONCAT(ROUND(pro.precio/1.14 , 2) + (SELECT SUM(ROUND(precio/1.14 , 2)) AS precio FROM acompanante_orden WHERE id_orden=p.id_orden) + ROUND(p.recargo/1.14 , 2) - p.descuento) * 0.14, 2), 
    ROUND(CONCAT(ROUND(pro.precio/1.14 , 2) + ROUND(p.recargo/1.14 , 2) - p.descuento) * 0.14, 2) 
    ), 2) as total 


    FROM orden p 
    LEFT JOIN producto_orden AS pro ON p.id_orden = pro.id_orden 
    LEFT JOIN acompanante_orden AS pa ON p.id_orden = pa.id_orden 

    WHERE p.actual_date BETWEEN '2017-04-01' AND '2017-04-01' and p.status=4 
) sum_1 

UNION ALL IDEA

select ROUND((sum(precio)) * 1.14,2) as total from (
    SELECT a.id_orden, ROUND(b.precio/1.14 , 2) + ROUND(a.recargo/1.14 , 2) - a.descuento as precio FROM orden a, producto_orden b WHERE a.id_orden=b.id_orden and a.actual_date BETWEEN '2017-04-01' AND '2017-04-01' and a.status=4 union all 
    SELECT c.id_orden, ROUND(d.precio/1.14 , 2) as precio FROM orden c, acompanante_orden d WHERE c.id_orden=d.id_orden and c.actual_date BETWEEN '2017-04-01' AND '2017-04-01' and c.status=4 
) sum_1 

UPDATE:

SO hier ist mein Tabellenschema: http://sqlfiddle.com/#!9/4fe12/2

, was ich brauche:

Ich brauche TOTAL der monatlichen SELLS zu bekommen, aber Werte auf DB sind mit STEUERN so, bevor ich total bekomme ich etwas Mathe tun müssen :

DB INFO

PRODUCT= $50.00 
ADDONS= $8.00 
SHIPPING= $6.00 

DISCOUNT= $2.00 

ERGEBNISSE I NEED:

PRODUCT= $50.00/1.14 = $43.86 
ADDONS= $8.00/1.14 = $7.02 
SHIPPING= $6.00/1.14 =$5.26 

SUBTOTAL= $56.14 - DISCOUNT($2)= $54.14 

SUBTOTAL= $54.14 * 1.14 = $61.72 
+1

Was sagt Ihnen EXPLAIN? Welche Indizes haben Sie an den beteiligten Tischen? Wie lange ist * zu lang *? Wenn Sie eine Unterauswahl für jede Spalte in jeder einzelnen Zeile und für mehrere Funktionsaufrufe vornehmen, wie erwarten Sie dann eine angemessene Leistung in Ihrer Abfrage? –

+0

EXPLAIN: http://imgur.com/a/aQS72 INDEXEN: KEINE LANGE hängt vom Datumsbereich ab, wenn ich '2017-02-01' UND '2017-04-01' wähle, dauert es in UNION etwa 6 Sekunden ALL 1 sec .... und ja, ich weiß, dass es viele Funktionen erfüllt, deshalb frage ich, ob es bessere Möglichkeiten gibt, Ergebnisse zu erzielen. – Ered

+0

Es ist schwierig, Ihnen zu sagen, ob es einen besseren Weg gibt oder nicht, weil Sie Ihre Tabellenschemas, Beispieldaten und die Ausgabe, die Sie erwarten, nicht von diesen Daten erhalten. Die Schemas sollten die Form CREATE TABLE DDL haben, damit jemand die Tabellen erstellen kann, wenn sie möchten, um eine Antwort zu finden. –

Antwort

1

Die erste Unterabfrage ist im Grunde:

SELECT . . . 
FROM orden p LEFT JOIN 
    producto_orden pro 
    ON p.id_orden = pro.id_orden LEFT JOIN 
    acompanante_orden pa 
    ON p.id_orden = pa.id_orden 
WHERE p.actual_date BETWEEN '2017-04-01' AND '2017-04-01' and 
     p.status = 4 

Für diese Abfrage Sie Indizes für orden(status, actual_date, id_id_orden) wollen, producto_orden (id_orden) , and acompanante_orden (id_orden) `.

Ich bin mir nicht sicher, was der Rest der Abfrage ist.

+0

sollte ich alle INDEXES löschen, die ich erstellt habe, nachdem die SQL-Abfrage durchgeführt wurde? – Ered

+0

@Ered. . . Das scheint eine schlechte Idee zu sein. Möglicherweise möchten Sie in Zukunft eine ähnliche Abfrage ausführen. –

+0

ok, also lasse ich einfach den Index zu diesen Zeilen, BTW könntest du einen Blick auf das UPDATE auf meinem Beitrag werfen, um zu sehen, ob es eine bessere Frage gibt, was ich brauche? – Ered