如何使用最新报告日期有效地跟踪货件的最后位置?

时间:2010-04-06 09:21:14

标签: mysql query-optimization query-performance

我需要在货物中找到每个货物的最新位置。我们主要通过查看为货物选择的路线然后查找最新(最长)时间来完成此操作 针对此路线的节点输入。例如,如果一条路线有5个节点并且我们已经输入了前3个节点的时间,那么最新的时间(最长时间)将告诉我们它在3个节点中的位置。
关于性能问题,我真的陷入了这个问题。即使是几百行,也需要2分钟以上。请建议我如何改进这个查询或我应该采取的其他方法?

注意:ATA =实际到达时间和ATD =实际出发时间

SELECT DISTINCT 
       c.id   as cid
     , c.ref  as cons_ref 
     , c.Name
     , c.CustRef  
  FROM consignments c  
 INNER JOIN routes r        ON c.Route = r.ID   
 INNER JOIN routes_nodes rn ON rn.Route = r.ID   
 INNER JOIN cargo_timing ct ON c.ID=ct.ConsignmentID   
 INNER JOIN ( SELECT t.ConsignmentID, Max(t.firstata) as MaxDate 
                FROM cargo_timing t 
               GROUP BY t.ConsignmentID 
            ) as TMax   
         ON (    TMax.MaxDate=ct.firstata 
             AND TMax.ConsignmentID=c.ID  
            )
INNER JOIN nodes an         ON ct.routenodeid = an.ID    
INNER JOIN contract cor     ON cor.ID = c.Contract   
WHERE c.Type = 'Road' 
  AND ( c.ATD = 0 AND c.ATA != 0 )   
  AND (cor.contract_reference in  ('Generic','BP001','020-543-912'))   
ORDER BY c.ref ASC    

1 个答案:

答案 0 :(得分:1)

您可以为每个节点分配一个ID,并将该ID作为外键添加到表consignments吗?这将允许您在货物通过节点时设置“当前”节点。现在和consignments表中“当前节点”字段的最后一次更新之间的时差可以让您了解货物在路线上的运行情况。