2016-06-10 67 views
0

如何使用任何類型的連接或子查詢或嵌套查詢來減少此查詢運行時間。如何使用mysql減少嵌套查詢時間

select 
`p`.`id`, 
`p`.`name`, 
SUM(s.quantity) as inst, 
from `product` as `p` 
LEFT JOIN sales as s ON s.pid=p.`id` AND s.sales_id IN (SELECT invoice.invoice_id FROM invoice WHERE invoice.ccid NOT IN (SELECT ccid FROM ticket WHERE st='1')) 
where `p`.`hc` = '1' 
GROUP BY `p`.`id` 
order by `p`.`name` DESC 
+1

使用,而不是內部聯接的查詢和左的連接,而不是不.....這將減少查詢時間,因爲在查詢需要太多時間 –

+0

'從產品選擇 p.id, p.name AS名稱, SUM(ss.instock)作爲研究所 爲p LEFT JOIN(SELECT s.id,s.pid,CASE COUNT(crt.salvage_part) WHEN 1 THEN 0 ELSE s.quantity END AS instock FR OM sales as s LEFT JOIN invoice as i ON i.invoice_id = s.sales_id LEFT JOIN crt ON crt.cc_id = i.cc_id AND crt.st ='1' GROUP BY s.id)as ss ON ss。 pid = p.id 其中p.hc ='1' GROUP BY p.id order by p.name DESC' **試過這個太,但不能減少它的運行時間。** –

+0

這個問題是無意義的顯然,這個查詢會產生一個語法錯誤。 – Strawberry

回答

0

最後我得出一個解決方案&它的工作原理

select 
s.pid, 
SUM(s.quantity) AS squan 
from invoice as i 
LEFT JOIN sales as s ON s.sales_id=i.invoice_id 
LEFT JOIN crt ON crt.cc_id=i.cc_id AND crt.ch='0' 
WHERE 
crt.ch='0' 
AND 
(i.cc_id!='' OR i.cc_id!='0') 
GROUP BY i.invoice_id 
+0

您選擇了pid,但GROUP BY爲invoice_id。這可能會提供不確定的/錯誤的結果。 – Strawberry

1

對ST門票添加索引,並在CCID從銷售發票和sales_id添加索引。

嘗試在查詢之前使用Explain子句是否在possible_keys列輸出中使用創建的索引。

+0

請解釋一下你的意思。如果可能的話用示例。 –

+0

不能使用索引 –