使用MTA API。
stop_times表看起来像这样:
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。
如何优化此功能以更好地运行?
答案 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;