2015-04-01 61 views
-2
具有不同表的朋友

我有以下問題:朋友在SQL

讓我們考慮一個社交網絡的情況:在同一個郵輪旅遊的乘客都被認爲是「朋友」,找到道格拉斯的朋友的朋友。

我試着使用下面的代碼解決它,但它不工作。它會返回道格拉斯和他的朋友,而不是道格拉斯朋友朋友的巡洋艦。

SELECT PASSENGERNUM 
FROM VOYAGE 
WHERE CRUISENUM 
IN (

SELECT CRUISENUM 
FROM VOYAGE 
WHERE PASSENGERNUM 
IN (

SELECT PASSENGERNUM 
FROM PASSENGER 
WHERE PASSENGERNAME != 'Douglas' 
AND PASSENGERNAME 
IN (

SELECT PASSENGERNAME 
FROM PASSENGER 
WHERE PASSENGERNUM 
IN (

SELECT PASSENGERNUM 
FROM VOYAGE 
WHERE CRUISENUM 
IN (

SELECT CRUISENUM 
FROM VOYAGE 
WHERE PASSENGERNUM 
IN (

SELECT passengernum 
FROM PASSENGER 
WHERE passengername = 'Douglas' 
) 
) 
) 
) 
) 
) 

這是我得到了這是隻有道格拉斯和他的朋友的passengernum改爲只道格拉斯的朋友passangernum

PASSENGERNUM 
11797 
11797 
11797 
12345 
12345 

這是數據庫表(乘客,航程): http://i.stack.imgur.com/S0I8D.png

Cruise database schema

+4

我建議花一些時間熟悉使用[JOINs in SQL](http://www.sitepoint.com/understanding-sql-joins-mysql-database)......它會使解決這個問題變得非常多更清潔/更簡單。 – 2015-04-01 23:28:51

+0

請編輯問題幷包含證明問題的測試數據。謝謝。 – 2015-04-01 23:35:56

+0

這個問題雖然可能很少解釋和提出,但仍然相當有趣 – 2015-04-02 01:38:53

回答

0

你會想要這樣的事情:

select p2.* 
    from passenger p1 
    inner join voyage v1 
     on p1.passengernum = v1.passengernum 
    inner join voyage v2 
     on v1.cruisenum = v2.cruisenum 
    inner join voyage v3 
     on v2.passengernum = v3.passengernum and v2.passengernum <> p1.passengernum 
    inner join voyage v4 
     on v3.cruisenum = v4.cruisenum and v4.cruisenum <> v1.cruisenum 
    inner join passenger p2 
     ON v4.passengernum = p2.passengernum 
    where p1.passengername = 'douglas' and v4.passengernum <> v2.passengernum; 
  1. 通過解釋,可以通過發現每個乘客已經對航海開始(內部連接1)。
  2. 然後,你會發現其他人在這些航行(內部連接2)
  3. 然後你會發現那些人在其他航行,除非人是原來的航程同一人(內部連接3 )
  4. 然後你找到其他人,在那些航行中(除了航程與第一次航程相同)(內部連接4)
  5. 然後我們將其限制在感興趣的人和人誰只在其他航程上,而不是第一個。

下面是一個例子:http://sqlfiddle.com/#!9/d59b9/15。我沒有聲稱這是完美的或優化的,但它看起來會給出正確的結果。