我已经很长时间没有直接使用 MySQL 了,所以为了好玩,我有一个基于纽约地铁系统的 MySQL 列车信息数据库。我有一个 Station
表和 Route
表,两者之间存在多对多关系。
我想要做的是找出两条或更多条不同路线有哪些共同点。我正在尝试不同的连接技术,但它们似乎都不起作用(我可能语法错误)。
例如,我想查看哪些车站同时提供路线“1”和“2”(即这些路线有哪些公共(public)车站?)。
mysql> describe station;
+-------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(45) | YES | UNI | NULL | |
+-------+-------------+------+-----+---------+----------------+
mysql> describe route;
+-------+------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(4) | YES | | NULL | |
+-------+------------+------+-----+---------+----------------+
它们之间的表称为 RouteStation
,它具有两个表中每个表的 ID。
我想要的查询是查找为任意一组路线提供服务的车站名称。因此,在这个示例中,我想查找为路线“1”和“2”提供服务的车站名称。
SELECT Station.name FROM Station
JOIN RouteStation ON (Station.id = RouteStation.stationId)
JOIN Route ON (Route.id = RouteStation.routeId)
WHERE Route.name = "1" AND Route.name = "2";
我知道最后一部分可能有问题,因为路线名称不可能同时为“1”和“2”,但我希望我正在寻找的要点是够清楚了。
编辑:RouteStation 架构:
mysql> describe routestation;
+-----------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------+---------+------+-----+---------+-------+
| stationId | int(11) | NO | MUL | NULL | |
| routeId | int(11) | NO | MUL | NULL | |
+-----------+---------+------+-----+---------+-------+
最佳答案
你能试试这个吗:
SELECT name
FROM station
WHERE id IN (
SELECT RS.stationId
FROM RouteStation RS
WHERE RS.routeId IN (1, 2)
GROUP BY RS.stationId
HAVING COUNT(RS.routeId) > 1
)
不应使用 AND
,而应使用 OR
关键字:routeId = 1 OR routeId = 2
。与 IN
关键字相同。
之后,我们使用了GROUP BY stationId
,这样我们就可以COUNT
routeIds
,因为我们只需要HAVING的车站
多于 1 条路线。
关于mysql - 为公共(public)表属性编写多对多查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35762274/