2013-08-01 109 views
2

我有表總線,街道,route_going,route_return對此的最佳查詢是什麼?

在表中的街道我有

實施例:

id | name 
1 | street1 
2 | street2 
3 | street4 
... 
n | streetn 

表route_going,我有實施例:

id_bus | id_street | order 
101 | 1   | 1 
101 | 2   | 2 
101 | 5   | 3 

... 

表route_return,我有例子:

id_bus | id_street | order 
101 | 3   | 1 
101 | 2   | 2 
101 | 1   | 3 

... 

好的,在這個例子中,公交車101依次從街道1,2和5行駛。並按照此順序從大街3,2和1返回。

我想知道哪些公交車在街道通過 'X' 和街道 'Y'(第一個X,後來Y)

例如:

x = 1, y = 5 -> the bus 101 pass 
x = 1, y = 3 -> the bus 101 pass 
x = 3, y = 1 -> the bus 101 pass 
x = 3, y = 5 -> the bus 101 don't pass 

所以,我的SQL的查詢公交車是...(通過爲街道1和5舉例)

select * from bus as b where 
-- The bus passes between the 2 streets at the going route?? 
exists (select * from route_going as rg1, route_going as rg2,street as r1,street as r2 where rg1.id_bus = rg2.id_bus and rg1.id_street = r1.id and rg2.id_street = r2.id and r1.id = 1 and r2.id = 5 and b.bus_id = rg1.id_bus and rg1.order <= rg2.order) 
-- The bus passes between the 2 streets at the return route?? 
or exists (select * from route_return as rg1, route_return as rg2,street as r1,street as r2 where rg1.id_bus = rg2.id_bus and rg1.id_street = r1.id and rg2.id_street = r2.id and r1.id = 1 and r2.id = 5 and b.bus_id = rg1.id_bus and rg1.order <= rg2.order) 
-- The bus passes between the 2 streets at the going route first and return route later?? 
or exists (select * from route_going as rg1, route_return as rg2,street as r1,street as r2 where rg1.id_bus = rg2.id_bus and rg1.id_street = r1.id and rg2.id_street = r2.id and r1.id = 1 and r2.id = 5 and b.bus_id = rg1.id_bus) 

所以,我覺得這個查詢是不好的。有人可以幫我說出這個搜索的「最佳」查詢嗎?

+1

我們可以有一個[SQL小提琴](http://sqlfiddle.com/)?請?另外,添加有關您的索引的信息。這可能會有所作爲。 – jpmc26

+0

我不明白,你的代碼做太多事情,只是要檢查一輛公共汽車是否通過街道 –

+0

@NoIdeaForName ** ** ** **街道!爲了! – Gabriel

回答

2
SET @x = 1; 
SET @y = 5; 

SELECT x.id_bus 
    FROM 
    (SELECT *,0 returning FROM route_going UNION SELECT *, 1 FROM route_return) x 
    JOIN 
    (SELECT *,0 returning FROM route_going UNION SELECT *, 1 FROM route_return) y 
    ON y.id_bus = x.id_bus 
    AND (y.returning > x.returning OR (y.returning = x.returning AND y.porder > x.porder)) 
WHERE x.id_street = @x 
    AND y.id_street = @y; 
+0

此查詢的SQL小提琴:http://sqlfiddle.com/#!2/a0a7d/25/0 – jpmc26

+1

如果您想要DISTINCT結果,請使用DISTINCT運算符。 – Strawberry

+0

我不知道'UNION ALL'是否會帶來任何性能提升。因爲這指定了'UNION'中的'0'或'1',所以沒有行將會是相同的,因此檢查重複行(如果引擎執行它)是浪費週期。 – jpmc26

0
select 
street.name, 
route_going.id_bus,route_going.id_street 
route_return.id_bus,route_return.id_street 
on street.id=route_going.id_street and 
route_return.id_street=route_going.id_street; 

試試這個。謝謝

+0

不起作用! =/ – Gabriel

相關問題