在SQL中使用不同表的朋友的朋友

时间:2015-04-01 23:19:56

标签: mysql 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'
)
)
)
)
)
)

这是我得到的道格拉斯和他的朋友只有乘客而不是道格拉斯的朋友passangernum

PASSENGERNUM
11797
11797
11797
12345
12345

这是数据库表(乘客,航程):  http://i.stack.imgur.com/S0I8D.png

Cruise database schema

1 个答案:

答案 0 :(得分: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. 然后我们将其限制在感兴趣的人,以及仅限于其他航程的人,而不是第一个航行的人。
  6. 以下是一个例子:http://sqlfiddle.com/#!9/d59b9/15。我没有声称这是完美的或优化的,但它看起来能给出正确的结果。