我有两张表格如下:
Highschooler
ID name grade
1510 Jordan 9
1689 Gabriel 9
1381 Tiffany 9
1709 Cassandra 9
1101 Haley 10
1782 Andrew 10
1468 Kris 10
1641 Brittany 10
1247 Alexis 11
1316 Austin 11
1911 Gabriel 11
1501 Jessica 11
1304 Jordan 12
1025 John 12
1934 Kyle 12
1661 Logan 12
Friends
ID1 ID2
1689 1709
1709 1689
1782 1709
1911 1247
1247 1468
1641 1468
1316 1304
1501 1934
1934 1501
1025 1101
我需要创建一个表格,其中包含“朋友”中给出的彼此之友的人的姓名和等级。表。我基本上需要查看朋友表中给出的每个ID的名称和等级。
我有两个select语句,分别查找ID1和ID2的名称和等级。
select name,grade from highschooler where id IN
(select id1 from friends)
和
select name,grade from highschooler where id IN
(select id2 from friends)
但是,我无法弄清楚如何获得一个如下所示的表:
name1 grade1 name2 grade2
Gabriel 9 Cassandra 9
我已尝试将两个select语句和union连接起来,但这两种情况都不适用。
我是SQL新手。非常感谢任何帮助!
答案 0 :(得分:3)
你需要两次加入'highschooler'表:
select h1.name, h1.grade, h2.name, h2.grade
from highschooler h1
inner join friends on friends.id1 = h1.id
inner join highschooler h2
on h2.id = friends.id2
'朋友'表和上述查询的问题是,即使A是B的朋友,B也不一定是A的朋友!
答案 1 :(得分:2)
正如之前的海报所提到的,你需要两次列出highschooler表,因为你需要引用它两次来比较来自friends表的ID。他的语法是正确的;使用直接连接和where子句的另一种方法是:
SELECT side1.name, side1.grade, side2.name, side2.grade
FROM highschooler AS side1, highschooler AS side2, friends
WHERE (side1.id = friends.id1 AND side2.id = friends.id2);
正如所指出的那样,这只会将朋友视为单向关系。在你的“朋友”表中,我确实看到一些“双向朋友”列出了两行,其中ID的顺序相反。如果您实际上想要将所有朋友关系视为双向,则必须与两个订单中列出的“朋友”表中的列进行两次比较。
SELECT DISTINCT side1.name, side1.grade, side2.name, side2.grade
FROM highschooler AS side1, highschooler AS side2, friends
WHERE (side1.id = friends.id1 AND side2.id = friends.id2) OR
(side1.id = friends.id2 AND side2.id = friends.id1);
注意我必须在这里使用DISTINCT,否则,如果友谊以相反的顺序列出两次(如1689,1709和1709,1689),它会在结果中列出两次; DISTINCT删除副本。
我猜你使用哪个查询取决于你是否认为朋友是“Facebook风格”的朋友或“Twitter风格”的朋友。 :)
答案 2 :(得分:1)
试试这个
SELECT T1.name,T1.grade,T2.name,T2.grade
FROM highschooler T1
LEFT Join Friends F ON F.id1 = T1.id
LEFT Join highschooler T2
on T2.id = F.id2