2017-04-07 266 views
-1

即時通訊工作的一個項目,我創造了這個SQL查詢,但似乎太長了,如果我選擇一個更大的日期範圍,任何想法如何使它更快地服用,我tryed與union all及其多快,但數據是不一樣的,需要代碼幫助:MySQL查詢時間太長

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:

所以這裏是我的表模式:http://sqlfiddle.com/#!9/4fe12/2

我需要什麼:

我需要每月賣出TOTAL,但DB值與稅等等之前,我總我需要做一些數學:

DB信息

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

DISCOUNT= $2.00 

結果我需要:

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

是什麼EXPLAIN告訴你嗎?你有什麼指標涉及表格?多久*太長*?當你在每一行的每一列上進行子選擇時,再加上多個函數調用,你如何期望在查詢中獲得任何體面的表現? –

+0

說明:http://imgur.com/a/aQS72 指標:上的時間範圍NONE LONG dependes如果我選擇「2017年2月1日」與「2017年4月1日」它需要在UNION大約6秒所有1秒....是的,我知道它使得很多功能,這就是爲什麼林詢問是否有更好的方法來達到結果。 – Ered

+0

這很難告訴你是否有更好的方法還是不行,因爲你已經不包含在您的表模式,樣本數據,以及你期望從這些數據得到的輸出。模式應該是CREATE TABLE DDL的形式,所以如果他們想要制定答案,有人可以創建表。 –

回答

1

第一個子查詢基本上是:

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 

對於此查詢,您想對orden(status, actual_date, id_id_orden),producto_orden(id_orden), and acompanante_orden(id_orden)`指標。

我不知道該查詢的其餘部分是什麼。

+0

應該刪除我在sql查詢完成後創建的所有索引? – Ered

+0

@Ered。 。 。這似乎是一個壞主意。您可能希望在未來運行類似的查詢。 –

+0

好吧,所以我只是把索引留給那些行,順便說一句,你可以看看我的帖子上的更新,看看是否有更好的查詢,我需要什麼? – Ered