为公共表属性编写多对多查询

时间:2016-03-03 02:50:41

标签: mysql

自从我直接使用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    |       |
+-----------+---------+------+-----+---------+-------+

1 个答案:

答案 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条路线的电台。