我有桌子:
City:
id | name
1 | New York
2 | Amsterdam
3 | Paris
4 | London
Trip:
id | name
1 | aaaa // New York --> Paris --> London
2 | bbbb // London --> Paris --> Amsterdam
3 | cccc // London --> New York --> Amsterdam --> Paris
4 | dddd // Paris --> London
5 | eeee // Amsterdam --> London
TripDetails:
id | tripId | cityId| order
1 | 1 | 1 | 1
2 | 1 | 3 | 2
3 | 1 | 4 | 3
4 | 2 | 4 | 1
5 | 2 | 3 | 2
6 | 2 | 2 | 3
7 | 3 | 4 | 1
8 | 3 | 1 | 2
9 | 3 | 2 | 3
10 | 3 | 3 | 4
11 | 4 | 3 | 1
12 | 4 | 4 | 2
13 | 5 | 2 | 1
14 | 5 | 4 | 2
现在我想通过旅行找到城市。
例如,如果我到达阿姆斯特丹,那么我希望收到巴黎(旅行ID = 3)和伦敦(旅行ID = 5)。不是纽约,因为在纽约阿姆斯特丹的旅行3之前。
其他例子:
如果我到达纽约,那么我应该收到所有城市 - 巴黎(旅行1),伦敦(旅行1)和阿姆斯特丹(旅行3)。
如果我到巴黎,那么我应该只收到伦敦和阿姆斯特丹。
所以我在巴黎(ID:3):
SELECT * FROM "City"
LEFT JOIN "TripDetails" ON City.id = TripDetails.cityId
WHERE TripDetails.cityId = 3
AND ????
我该怎么做?
如有必要,我可以更改数据库的整个结构。我使用PHP和MySQL。
答案 0 :(得分:1)
尝试这样的事情。此示例适用于纽约(city id = 1):
查询1 :
SELECT distinct city.name
FROM tripDetails td1
INNER JOIN tripDetails td2 ON td1.tripId = td2.tripId AND
td2.order > td1.order
INNER JOIN city ON td2.cityId = city.id
INNER JOIN trip ON td2.tripId = trip.id
WHERE td1.cityID = 1
<强> Results 强>:
| NAME |
|-----------|
| Paris |
| London |
| Amsterdam |