2013-10-07 50 views
0

my previous question的评论说:“我会建议看看这里的答案:stackoverflow.com/questions/1313120/…。您接受的答案在技术上是正确的,实际上可能会变得非常低效,因为MySQL不喜欢相关的子查询。如何使此查询更有效?

我接受的答案的SQl是at SQL fiddle。引用的问题比较了LEFT JOIN和INNER JOIN。 SQL Fddle仅使用JOIN <,我知道它默认为INNER JOIN。

那么,我该如何重写查询以使用LFT JOIN?

+0

添加 “LEFT” 捧场(巧合的是,左侧)的前面;) –

回答

2

我不确定在mysql上的性能,但是您可以对可能会取消您的位置的行进行LEFT JOIN,然后使用WHERE来只选择其中LEFT JOIN不匹配的记录。

SELECT v.id 
    , v.description 
    , v.type 
    , p.time_stamp 
    , p.latitude 
    , p.longitude 
    FROM positions p 
    JOIN vehicles v ON v.id = p.id 
    LEFT JOIN positions l ON l.id = p.id 
         AND l.time_stamp > p.time_stamp 
    WHERE l.id IS NULL 

或者,在SQLFiddle:http://sqlfiddle.com/#!2/2e994/31/0