自从我直接使用MySQL以来已经有很长一段时间了,所以为了好玩,我有一个基于纽约地铁系统的列车信息的MySQL数据库。我有一个Station
表和Route
表,两者之间存在多对多的关系。
我想要做的是找出两条或更多条不同路线的共同点。我正在尝试不同的连接技术,但它们似乎都没有工作(我可能有错误的语法)。
例如,我想知道哪些电台服务于“1”和“2”两个路由(即这些路由有哪些共同点?)。
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 | |
+-----------+---------+------+-----+---------+-------+
答案 0 :(得分:2)
你能试试这个:
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条路线的电台。