-1

問題の仕様とデータベースの状態: データベースには 3 つのテーブル ( HighschoolerFriendLikes ) があり、 Here is database :

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

Friend
ID1 ID2
1510    1381
1510    1689
1689    1709
1381    1247
1709    1247
1689    1782
1782    1468
1782    1316
1782    1304
1468    1101
1468    1641
1101    1641
1247    1911
1247    1501
1911    1501
1501    1934
1316    1934
1934    1304
1304    1661
1661    1025
1381    1510
1689    1510
1709    1689
1247    1381
1247    1709
1782    1689
1468    1782
1316    1782
1304    1782
1101    1468
1641    1468
1641    1101
1911    1247
1501    1247
1501    1911
1934    1501
1934    1316
1304    1934
1661    1304
1025    1661

Likes
ID1 ID2
1689    1709
1709    1689
1782    1709
1911    1247
1247    1468
1641    1468
1316    1304
1501    1934
1934    1501
1025    1101

質問は:For every student who likes someone 2 or more grades younger than themselves, return that student's name and grade, and the name and grade of the student they like.

私のクエリは次のとおりです。

select HS11.name,HS11.grade,HS22.name,HS22.grade from
( select ID1,ID2 from Likes where ID1 in
(
select HS1.ID from Highschooler HS1, Highschooler HS2 
where HS1.ID<> HS2.ID and (HS1.grade - HS2.grade) >=2 
)
and ID2 in
(
select HS2.ID from Highschooler HS1, Highschooler HS2 
where HS1.ID<> HS2.ID and (HS1.grade - HS2.grade) >=2 
)
) as G, Highschooler HS11, Highschooler HS22
where HS11.ID=G.ID1 and HS22.ID = G.ID2

私のクエリの出力は次のとおりです。

Alexis 11 Kris 10
John 12 Haley 10

予想される出力は次のとおりです。

John 12 Haley 10

したがって、1行余分に取得していますが、これは正しくありません。ここで私が間違っていることを誰か指摘してもらえますか?

4

5 に答える 5

1

私は行きます

select a.name as liker, a.grade as liker_grade, c.name as likee, c.grade as likee_grade from
highschooler a inner join likes b on a.id = b.id1
left join highschooler c on b.id2 = c.id
where a.grade >= c.grade +2

そして、好きなものが常に相互である場合(通常はそうではありませんが、それ自体と組み合わせてすべてを結合します

select a.name as liker, a.grade as liker_grade, c.name as likee, c.grade as likee_grade from
highschooler a inner join likes b on a.id = b.id1
left join highschooler c on b.id2 = c.id
where a.grade >= c.grade +2
union all
select a.name as liker, a.grade as liker_grade, c.name as likee, c.grade as likee_grade from
highschooler a inner join likes b on a.id = b.id2
left join highschooler c on b.id1 = c.id
where a.grade >= c.grade +2
于 2013-01-28T07:19:54.013 に答える
1

を使用すると、ステートメントSELECTを簡略化できますINNER JOIN。次にWHERE、要件を指定する1つの句を作成できます。

SELECT HS1.name, HS1.grade, HS2.name, HS2.grade
FROM Likes
INNER JOIN Highschooler HS1
  ON Likes.ID1 = HS1.ID
INNER JOIN Highschooler HS2
  ON Likes.ID2 = HS2.ID
WHERE (HS1.grade - HS2.grade) >=2 

つまり、複雑な要件を持つサブクエリを使用して必要なIDを見つけようとする代わりに、1つの仮想テーブルを選択し、そのテーブルに直接要件を配置します。

于 2013-01-28T07:04:56.230 に答える
0

はいの場合、これは機能するはずです

Select main.*
  from Highscooler main
       join Likes lk on main.ID = lk.ID1
       join Highscooler mate on mate.ID = lk.ID2
  where main.Grade >= mate.Grade+2

編集:答えを修正しました(「いいね」は「友達」テーブルを使用して表現されていると思いました)。また、「のように」を理解していませんでした(私はFBを使用していません;-))

再度修正:テキストを読むのが苦手です...

于 2013-01-28T07:01:19.257 に答える
0
SELECT   liker.ID AS LikerID,
         liker.Name AS LikerName,
         liker.Grade AS LikerGrade,
         liked.ID AS LikedID,
         liked.Name AS LikedName,
         liked.Grade AS LikedGrade
FROM     Likes
JOIN     HighSchooler Liker ON Likes.ID1 = Liker.ID
JOIN     HighSchooler Liked ON Likes.ID2 = Liked.ID
WHERE    2 <= (Liker.Grade - Liked.Grade)

あなたを近づける必要があります

于 2013-01-28T07:02:57.950 に答える
0

このようなもの(構文が間違っている可能性があります)をselect *正しい列に置き換えます

select * from highschooler as me
left join on friend where me.id = friend.id1
left join on highschooler as f where f.id = freind.id2
where me.grade - f.grade >= 2
于 2013-01-28T07:05:04.787 に答える