我要计算一致性率,并保留交付总数,这是SQL中每个运营商(transporteur)的所有交付。以下是我为满足这一需求而量身定制的查询,并且成功完成,但执行大约需要5分钟(知道“LIVRAISON”表有大约350.000个条目):
SELECT idTrans AS id,
nomTrans,
(COUNT(codeSt)
/ (SELECT COUNT(*)
FROM LIVRAISON
NATURAL JOIN TOURNEE
WHERE idTrans=id
AND DateTrn = DATE_SUB(SYSDATE(), INTERVAL 1 DAY)
)
) AS Taux,
(SELECT COUNT(*)
FROM LIVRAISON
NATURAL JOIN TOURNEE
WHERE idTrans=id
AND DateTrn = DATE_SUB(SYSDATE(), INTERVAL 1 DAY)
) AS Total
FROM LIVRAISON
NATURAL JOIN TOURNEE
NATURAL JOIN TRANSPORTEUR
WHERE "{status_type}"
AND DateTrn = DATE_SUB(SYSDATE(), INTERVAL 1 DAY)
GROUP BY idTrans
(status_type
是PHP中添加的IN条件。)
我怎样才能加快这种查询(并按顺序简化)到几秒钟?
答案 0 :(得分:1)
查看代码,您可以使用连接中的子选择来避免选择列值,例如:
select DISTINCT LIVRAISON.idTrans AS id
, TRANSPORTEUR.nomTrans
, t.my_rate
, t.my_count
FROM LIVRAISON
NATURAL JOIN TOURNEE
NATURAL JOIN TRANSPORTEUR
INNER JOIN (
SELECT idTrans, COUNT(codeSt)/COUNT(*) my_rate, COUNT(*) my_count
FROM LIVRAISON
NATURAL JOIN TOURNEE
WHERE idTrans=id
AND DateTrn = DATE_SUB(SYSDATE(), INTERVAL 1 DAY)
GROUP BY idTrans ) t ON t.idTrans = LIVRAISON.idTrans
WHERE "{status_type}"
AND DateTrn = DATE_SUB(SYSDATE(), INTERVAL 1 DAY)
可能是你也可以使用另一个内连接来避免使用IN子句