优化MySQL子查询

时间:2011-11-11 15:32:44

标签: mysql query-optimization

使用MTA API。

stop_times表看起来像这样: trip_id, stop_id

每行列出stop_ids,重复

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。

如何优化此功能以更好地运行?

3 个答案:

答案 0 :(得分:2)

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

答案 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

答案 2 :(得分:0)

SELECT trip_id FROM stop_times WHERE stop_id IN (##,##)
HAVING count(DISTINCT stop_id)=2;