2017-02-08 93 views
0

我相信知道我的問題在哪裏,但我不確定如何解決它。 我正試圖找到出發地點與抵達地點不同的地方。但是我編寫代碼的方式使得它只返回具有相同出發和到達位置的集合。我該如何解決這個問題?我想找到一個從波士頓出發並抵達拿騷的行程,同時避免使用類似旅行的代碼。 DepartureLocCode = 「BOS」mysql代碼返回一個空集

SELECT name 
    FROM staff, trip, locations 
    WHERE trip.TripNum = staff.TripNum AND staff.DATE = trip.DATE AND trip.DATE = '2015-08-14' 
    AND (trip.ArrivalLocCode = locations.LocationCode AND locations.Location = "Nassau") 
    AND (trip.DepartureLocCode = locations.LocationCode And locations.Location = "Boston"); 

回答

3

第一:FROM子句中決不使用逗號。 始終使用使用正確的,明確的JOIN語法。如果您正在學習SQL,則尤其如此。

你的主要問題,不過,是你需要兩個連接:

SELECT name 
FROM staff s JOIN 
    trip t 
    ON t.TripNum = s.TripNum JOIN 
    locations la 
    ON t.ArrivalLocCode = la.LocationCode JOIN 
    locations ld 
    ON t.DepartureLocCode = ld.LocationCode 
WHERE t.DATE = '2015-08-14' AND 
     la.Location = 'Nassau' AND 
     ld.Location = 'Boston'; 
+0

這非常有用。我瞭解了使用JOIN感謝你的重要性。非常感謝你。非常感謝。 –

1

你需要加入的位置表兩次這樣的。 (我使用了現代的顯式JOIN語法)

SELECT name 
FROM staff s 
inner join trip t on t.TripNum = s.TripNum AND s.DATE = t.DATE 
inner join locations l1 on t.ArrivalLocCode = l1.LocationCode 
inner join locations l2 on t.DepartureLocCode = l2.LocationCode 
WHERE t.DATE = '2015-08-14' 
AND l1.Location = 'Nassau' 
AND l2.Location = 'Boston'; 
1

您需要連接到位置表兩次。

我不是隱式連接的粉絲,它妨礙了可讀性恕我直言,所以我已經明確你的連接。

SELECT name 
FROM staff s 
JOIN trip t ON t.TripNum = staff.TripNum 
JOIN locations l1 ON t.ArrivalLocCode = l1.locationCode 
JOIN locations l2 ON t.DepartureLocCode = l2.locationCode 
WHERE s.DATE = t.DATE 
AND t.DATE = '2015-08-14' 
AND l1.location = 'Nassau' 
AND l2.location = 'Boston'