mysql - 如何显示第一个表中的 id 来自第二个表的 2 个不同的 id

标签 mysql sql join

数据库是关于公交车交通的,所以有三个表:

停止

 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 byhaving 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 可能会多次停靠(在路线起点和终点位于同一车站的情况下)。

Sample SQL Fiddle

关于mysql - 如何显示第一个表中的 id 来自第二个表的 2 个不同的 id,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32070061/

相关文章:

mysql - 数据库架构(帮助)

php - 使php文件对外界隐藏

MySQL:如何使用 GROUP BY 选择每个组的第 N 个值

mysql - 如何避免执行子查询?

mysql - Cloud9 的数据库管理与外部数据库管理工具

mysql - 在 Sequelize 中填充没有关联 id 的数据

mysql - Slow IN() MySQL 查询优化

sql - 缓慢的 MySQL 查询。我应该索引什么?

php - Zend Join 左警告 : Select query cannot join with another table in/var/www/myiartz/library/Zend/Db/Select. php

mysql - 在继承情况下使用 UNION 和 JOIN - MySQL