2014-11-02 91 views
0

我正在做斯坦福免费在线课程(我推荐!),我被困在以下问题。请帮忙。双嵌套级别的SQL查询

找到与名为Gabriel的人成为朋友的所有学生的姓名。

这是我能想到的最好的。

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精简版运行查询(我已经明白,他们是这样一个基本的查询比较相似)。

/* 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 – 2014-11-02 21:43:34

+0

@Andrey我不认为我们想在这里有所区别。表中可以有多个名称。 – AdamMc331 2014-11-02 21:45:02

+0

是的,你是对的 – 2014-11-02 21:50:41

1

我建议你做的是把它分解成碎片并放在一起。

首先,让我们谁都有名字加布里埃尔所有的人的ID:

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

现在,我们可以在其中找到此ID存在的ID1所有友谊的列表:

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

由于您已将表格设置为包含列出相同两个朋友的两种方式,因此您不必担心做相反的事情(其中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的例子。