2016-03-03 39 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