2015-08-18 25 views
0

數據庫是關於公共汽車交通顯示,從1臺的ID,這樣有三個表:如何從2點不同的ID從第2臺

STOP

stop_id | stop_name 
-------------------- 
    1 | station_1 
    2 | station_2 
    3 | station_3 

ROUTE

route_id | route_num 
-------------------- 
1  | route_1 
2  | route_2 
3  | route_3 

ROUTE_STOP

stop_id | route_id 
------------------ 
1  | 1 
2  | 1 
1  | 2 
3  | 2 
1  | 3 
2  | 3 
3  | 3 

所以第1路有站1和2,第2路有站1和3,第3路有全站。

試圖讓route_num它通過station_1和station_3雲:

SELECT distinct(r.route_num) from STOP s 
JOIN ROUTE_STOP rs 
ON s.stop_id = rs.stop_id 
JOIN ROUTE_STOP r_s 
ON rs.stop_id = r_s.stop_id 
JOIN ROUTE r 
ON rs.route_id = r.route_id 
WHERE s.stop_name='station_1' OR s.stop_name='station_3' 
AND rs.stop_id <> r_s.stop_id 

和結果應該是route_2和route_3,但它不工作。如果站點之間沒有路線,則不應有結果。

如何獲得route_num經過2個站,沒有結果,如果沒有2站之間的路線?

+0

是否達到停止的順序很重要?這不記錄在您的模式中。 – Strawberry

+0

無關緊要,ROUTE_STOP中的字段'time'將顯示,它將被添加 – Chiefster

回答

0

一種方法是連接表,要麼使用in子句與group byhaving count()通過route_num找到匹配的組,或組,並使用其第篩選您希望有解數組:

-- query 1 
SELECT r.route_num 
FROM ROUTE r 
JOIN ROUTE_STOP rs ON r.route_id = rs.route_id 
JOIN STOP s ON rs.stop_id = s.stop_id 
WHERE s.stop_name IN ('station_1','station_3') 
GROUP BY r.route_num 
HAVING COUNT(DISTINCT s.stop_id) = 2; 

-- query 2 
SELECT r.route_num 
FROM ROUTE r 
JOIN ROUTE_STOP rs ON r.route_id = rs.route_id 
JOIN STOP s ON rs.stop_id = s.stop_id 
GROUP BY r.route_num 
HAVING (SUM(CASE WHEN s.stop_name = 'station_1' THEN 1 ELSE 0 END) = 1) 
    AND (SUM(CASE WHEN s.stop_name = 'station_3' THEN 1 ELSE 0 END) = 1); 

因爲MySQL計算布爾表達式爲1或0,你可以在最後一次查詢降低having子句:

HAVING (SUM(s.stop_name = 'station_1') = 1) 
    AND (SUM(s.stop_name = 'station_3') = 1); 

這兩個查詢都假定在一條路徑中(在路由開始和結束時在同一個站點中)可能發生多次停止。

Sample SQL Fiddle

0

您的查詢應該是這樣做

SELECT r.route_num from route r 
JOIN ROUTE_STOP rs 
ON r.route_id = rs.route_id 
JOIN STOP s ON rs.stop_id = s.stop_id 
WHERE s.stop_name in ('station_1','station_3');