2016-06-10 78 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

不能使用索引 –