2014-11-02 2 views
0

스탠포드 무료 온라인 과정 (나는 권장 함)을 수행하고 있으며 다음과 같은 문제에 봉착했습니다. 도와주세요.이중 중첩 수준의 SQL 쿼리

가브리엘이라는 사람과 친구 인 모든 학생의 이름을 찾습니다.

내가 생각할 수있는 최선의 방법입니다.

select name 
from highschooler h 
where h.id exists in (
    select friend.id1 
    from friend 
    where friend.id2 exists in (
     select h.id 
     from highschooler h2 
     where h2.name="gabriel" 
    ) 
); 

는 내가 테스트 장소로 MySQL의 워크 벤치를 사용하고 있지만 SQL Lite에서 쿼리를 실행하는 데 필요한거야 (나는 그들이 이와 같은 기본적인 쿼리에 대해 상대적으로 유사하다는 것을 알 수있다).

/* Create the schema for our tables */ 
create table Highschooler(ID int, name text, grade int); 
create table Friend(ID1 int, ID2 int); 
create table Likes(ID1 int, ID2 int); 

/* Populate the tables with our data */ 
insert into Highschooler values (1510, 'Jordan', 9); 
insert into Highschooler values (1689, 'Gabriel', 9); 
insert into Highschooler values (1381, 'Tiffany', 9); 
insert into Highschooler values (1709, 'Cassandra', 9); 
insert into Highschooler values (1101, 'Haley', 10); 
insert into Highschooler values (1782, 'Andrew', 10); 
insert into Highschooler values (1468, 'Kris', 10); 
insert into Highschooler values (1641, 'Brittany', 10); 
insert into Highschooler values (1247, 'Alexis', 11); 
insert into Highschooler values (1316, 'Austin', 11); 
insert into Highschooler values (1911, 'Gabriel', 11); 
insert into Highschooler values (1501, 'Jessica', 11); 
insert into Highschooler values (1304, 'Jordan', 12); 
insert into Highschooler values (1025, 'John', 12); 
insert into Highschooler values (1934, 'Kyle', 12); 
insert into Highschooler values (1661, 'Logan', 12); 

insert into Friend values (1510, 1381); 
insert into Friend values (1510, 1689); 
insert into Friend values (1689, 1709); 
insert into Friend values (1381, 1247); 
insert into Friend values (1709, 1247); 
insert into Friend values (1689, 1782); 
insert into Friend values (1782, 1468); 
insert into Friend values (1782, 1316); 
insert into Friend values (1782, 1304); 
insert into Friend values (1468, 1101); 
insert into Friend values (1468, 1641); 
insert into Friend values (1101, 1641); 
insert into Friend values (1247, 1911); 
insert into Friend values (1247, 1501); 
insert into Friend values (1911, 1501); 
insert into Friend values (1501, 1934); 
insert into Friend values (1316, 1934); 
insert into Friend values (1934, 1304); 
insert into Friend values (1304, 1661); 
insert into Friend values (1661, 1025); 
insert into Friend select ID2, ID1 from Friend; 

insert into Likes values(1689, 1709); 
insert into Likes values(1709, 1689); 
insert into Likes values(1782, 1709); 
insert into Likes values(1911, 1247); 
insert into Likes values(1247, 1468); 
insert into Likes values(1641, 1468); 
insert into Likes values(1316, 1304); 
insert into Likes values(1501, 1934); 
insert into Likes values(1934, 1501); 
insert into Likes values(1025, 1101); 

대단히 감사합니다!

답변

2

당신은 기본적으로 관계 Highschooler를 구축,이를 위해 두 번 Highschooler 테이블을 참조 할 것 -> 친구 -> Highschooler

그 방법은 다음과 같습니다

여기
select h1.name 
from Highschooler h1 
inner join Friend f on f.ID1 = h1.ID 
inner join Highschooler h2 on f.ID2 = h2.ID 
where h2.name = 'Gabriel' 

쿼리와 함께 SQL Fiddle있어 위.

+0

나는 DISTINCT를 추가 할 것이다 –

+0

@Andrey 나는 여기에서 별개라고 생각하지 않는다. 표에 여러 이름을 사용할 수 있습니다. – AdamMc331

+0

네, 맞습니다. –

1

내가 추천하는 것은 이것을 조각으로 나누어 다시 조립하는 것입니다.

SELECT f.id2 
FROM friend f 
WHERE f.id1 IN(SELECT s.id 
       FROM highschooler s 
       WHERE s.name = 'Gabriel'); 
: 우리는이 ID가 ID1로 존재하는 모든 우정의 목록을 찾을 수 있습니다 지금

SELECT s.id 
FROM highschooler s 
WHERE s.name = 'Gabriel'; 

:

먼저, 이름 가브리엘이있는 모든 사람의 ID를하자

두 친구를 나열하는 두 가지 방법을 모두 포함하도록 테이블을 설정 했으므로 반대쪽 (f.id2는 Gabriel)에서 걱정할 필요가 없습니다.

이제 위의 쿼리를 highschooler 테이블과 조인하여 이름을 얻을 수 있습니다.

SELECT s.name 
FROM highschooler s 
JOIN(SELECT f.id2 
    FROM friend f 
    WHERE f.id1 IN(SELECT s.id 
        FROM highschooler s 
        WHERE s.name = 'Gabriel') 
    ) t 
ON t.id2 = s.id; 

여기는 SQL Fiddle입니다.