0

私はこれらのテーブルを持っています:

高校生 ( ID, 名前, 学年 ) ある学年に固有の ID と名前を持つ高校生がいます。

友達 ( ID1, ID2 ) ID1 の生徒は ID2 の生徒と友達です。友情は相互的なものなので、(123, 456) が Friend テーブルにある場合、(456, 123) もそうです。

いいね ( ID1, ID2 ) ID1 の生徒は ID2 の生徒にいいね!誰かを好きになることは必ずしも相互的なものではないため、(123, 456) が Likes テーブルにある場合、(456, 123) も存在するという保証はありません。

2 人の学生 A と B が友達で、A が B を好きで、その逆ではない場合、Likes タプルを削除したいと思います。

まず、友達である非相互のいいねの2つのタプルだけを取得しようとしましたが、失敗しました...

私はこれを持っています:

SELECT * 
FROM Likes
where Likes.ID1 in (
   select Likes.ID1 
   from Likes, Friend
   where Likes.ID1=Friend.ID1 
     and Likes.ID2=Friend.ID2
   ) 
AND NOT IN (
   SELECT Likes.ID1 
   FROM Likes L1, Likes L2, Friend
   WHERE L1.ID1=Friend.ID1 
     AND L2.ID2=Friend.ID2 
     AND L1.ID1 = L2.ID2 
     AND L1.ID2 = L2.ID1);

しかし、それは機能していません..エラーが発生します..誰かが私を助けてくれますか!

私は実際に値を含むテーブルの画像を持っていますが、それを行うには10を超える評判が必要なため、投稿できません...

編集:

わかりました。まだ正しい結果が得られていないので、ここにテーブルを配置します。

Highschooler
ID  name    grade
1510    Jordan  9
1689    Gabriel 9
1381    Tiffany 9
1709    Cassand 9
1101    Haley   10
1782    Andrew  10
1468    Kris    10
1641    Brit    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

最後に、次の 2 つのタプルを likes テーブルから削除することになっています: 1911-1247 1641-1468

彼らは友達でもある非相互の好きです

4

4 に答える 4

1

この問題についてスタンフォード大学のSQL入門コースを行っていたので、私の実際の回答を含めます。SQliteで動作する必要があることに言及することは良い考えでした. 私は SQL の初心者であり、より洗練されたソリューションがあると確信していますが、これは自動テストに合格するはずです。これが私の解決策です:

DELETE FROM likes
WHERE likes.id1 in (Select s1.id
FROM highschooler s1, highschooler s2, friend, likes
WHERE s1.id <> s2.id
  AND friend.id1 = s1.id 
  AND friend.id2 = s2.id
  AND likes.id1 = s1.id 
  AND likes.id2 = s2.id
  AND s2.id NOT IN (SELECT s3.id FROM likes, highschooler s3, highschooler s4
                    WHERE s3.id = s2.id 
                        AND s4.id = s1.id
                        AND s3.id <> s4.id 
                        AND likes.id1 = s3.id 
                        AND likes.id2 = s4.id))
于 2015-01-02T19:15:45.403 に答える
0

これはクエリでエラーを正確に検出しているわけではありませんが、次のようにします。

SELECT * 
FROM Likes L1
WHERE
EXISTS ( -- friendship exists
   SELECT *
   FROM Friends F 
   WHERE  F.ID1 IN (L1.ID1, L1.ID2) AND F.ID2 IN (L1.ID1, L1.ID2)
)
AND NOT EXISTS ( -- reverse like does not exist
   SELECT *
   FROM Likes L2
   WHERE L1.ID1  = L2.ID2 AND L1.ID2 =  L2.ID1
);

友達の順番ABで、LikesFriendsは異なる可能性があることに注意してください。そのため、私が行ったように、またはステートメントをJOIN使用する必要があります。INOR

于 2013-02-16T21:45:38.177 に答える
0

これを試して

  SELECT * 
 FROM Likes
 where Likes.ID1 in 
               (select Likes.ID1 from Likes, Friend where Likes.ID1=Friend.ID1 and Likes.ID2=Friend.ID2) 
  AND Likes.ID1 NOT IN (SELECT Likes.ID1 FROM Likes L1, Likes L2, Friend WHERE L1.ID1=Friend.ID1 AND L2.ID2=Friend.ID2 AND L1.ID1 = L2.ID2 AND L1.ID2 = L2.ID1);
于 2013-02-16T21:28:28.430 に答える
0

あなたのエラーは、2 番目の AND 条件で Likes.ID1 フィールドを繰り返す必要があるためです。

SELECT * 
FROM Likes
where Likes.ID1 in (select Likes.ID1
                    from Likes, Friend
                    where Likes.ID1=Friend.ID1 and Likes.ID2=Friend.ID2)
  AND Likes.ID1 NOT IN (SELECT Likes.ID1
             FROM Likes L1, Likes L2, Friend
             WHERE L1.ID1=Friend.ID1
               AND L2.ID2=Friend.ID2
               AND L1.ID1 = L2.ID2
               AND L1.ID2 = L2.ID1);

クエリが正しい結果を返すかどうかを分析しませんでした。これはそうかもしれませんが、

select *
from Likes L1
  inner join Friend on L1.ID1 = Friend.ID1
  left outer join Likes L2 on Friend.ID2 = L2.ID1 and L1.ID1 = L2.ID2
where L2.ID2 is null
于 2013-02-16T21:29:12.793 に答える