SQL-在表中查找值

时间:2014-03-17 03:27:38

标签: sql

我有两张表格如下:

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新手。非常感谢任何帮助!

3 个答案:

答案 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