数据库是关于公交车交通的,所以有三个表:
停止
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,而第三条路线有所有车站。
尝试获取经过 station_1 和 station_3 的 route_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个站点的route_num
,如果2个站点之间没有路线,则没有结果?
最佳答案
实现此目的的一种方法是连接表,并使用带有 group by
和 having count()
的 in
子句来找到匹配的组,或按route_num分组并使用having子句来过滤具有您想要的站点的组:
-- 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 将 bool 表达式计算为 1 或 0,因此您可以将最后一个查询中的 having
子句减少为:
HAVING (SUM(s.stop_name = 'station_1') = 1)
AND (SUM(s.stop_name = 'station_3') = 1);
这两个查询都假设一条 route 可能会多次停靠(在路线起点和终点位于同一车站的情况下)。
关于mysql - 如何显示第一个表中的 id 来自第二个表的 2 个不同的 id,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32070061/