簡體   English   中英

如何從第二個表中顯示2個不同的ID從第一個表中顯示ID

[英]How to show id from 1st table from 2 different ids from 2nd table

數據庫是關於公交車運輸的,因此有三個表:

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

路線

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和2,第二條路線具有站點1和3,而第三條路線具有所有站點。

嘗試獲取通過route_numroute_num

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,但不起作用。 如果站點之間沒有路由,則不會有任何結果。

如果2個站點之間沒有路由,如何獲取通過2個站點卻沒有結果的route_num

您的查詢應為

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');

一種方法是聯接表,或者將in子句與具有group byhaving count()的組having count()來查找匹配的組,或者通過route_num進行分組,並使用hading子句來過濾具有所需停靠點的組。 :

-- 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 hading子句減少為:

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

這兩個查詢均假定在一條路線中可能發生多次停車(對於在同一站點開始和結束的一條路線)。

示例SQL提琴

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM