2011-11-11 105 views
0

使用MTA API。優化MySQL子查詢

stop_times表看起來像這樣:作爲stop_ids每行上市 trip_id, stop_id

trip_id重複。例如:

1111, 1 
    1111, 2 
    1111, 3 
    2222, 1 
    2222, 3 
    3333, 1 
    3333, 2 

目標是選擇我們知道肯定會停在兩個特定車站的火車的trip_id。 如果我們想要列車將在1和3停止,我們會得到遊1111和2222 或者,如果1和2,則1111和3333

這是我寫的很快,當然它運行,而慢:

SELECT trip_id 
FROM stop_times 
WHERE stop_id=## 
    AND trip_id IN (SELECT trip_id FROM stop_times WHERE stop_id=##) 

基本上,我試圖做相當於MS SQL INTERSECT。

我該如何優化這個以更好地運行?

回答

2
select trip_id 
from stop_times 
where stop_id in (111, 222) 
group by trip_id 
having count(distinct stop_id) = 2 
+1

+1,你快。 –

0

查看多種方式來完成這個這個優秀的答案 - 加上性能測試:
how-to-filter-sql-results-in-a-has-many-through-relation

一種方法是這樣的(假設(trip_id, stop_id)組合是UNIQUE在你的表):

SELECT a.trip_id 
FROM stop_times a 
    JOIN stop_times b 
    ON b.trip_id = a.trip_id 
WHERE a.stop_id = #1 
    AND b.stop_id = #2 
0
SELECT trip_id FROM stop_times WHERE stop_id IN (##,##) 
HAVING count(DISTINCT stop_id)=2;