2016-03-03 41 views
0

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

你能向我们展示'RouteStation'模式吗?谢谢 – KaeL

+0

@KaeL我编辑了问题以显示模式。 –

+0

@SameerMirji它不断返回一个“空集”。它适用于单个路由名称(例如“1”或“2”),如果我把'OR'而不是'AND',它只是给了我一切。 –

回答

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,所以我们可以COUNTrouteIds,因为我们只需要多个路线是HAVING的站。

+1

哇,工作!非常感谢! –

+0

不客气@DavidMordigal – KaeL