SQL查询我遇到了问题
我有这些桌子: 高中生身份证、姓名、年级 在某个年级,有一个高中生有唯一的ID和一个已知的名字 朋友ID1,ID2 ID1的学生与ID2的学生是朋友。友谊是相互的,所以如果朋友表中有123456,那么456123也是 喜欢ID1,ID2 ID1的学生喜欢ID2的学生。喜欢一个人并不一定是相互的,所以如果123,456在喜欢表中,也不能保证456,123也在 如果两个学生A和B是朋友,A喜欢B,但不是相反,我想删除likes元组 首先,我试着只得到两组非互惠的喜欢,他们是朋友,但我没有成功 我有这个:SQL查询我遇到了问题,sql,database,sqlite,Sql,Database,Sqlite,我有这些桌子: 高中生身份证、姓名、年级 在某个年级,有一个高中生有唯一的ID和一个已知的名字 朋友ID1,ID2 ID1的学生与ID2的学生是朋友。友谊是相互的,所以如果朋友表中有123456,那么456123也是 喜欢ID1,ID2 ID1的学生喜欢ID2的学生。喜欢一个人并不一定是相互的,所以如果123,456在喜欢表中,也不能保证456,123也在 如果两个学生A和B是朋友,A喜欢B,但不是相反,我想删除likes元组 首先,我试着只得到两组非互惠的喜欢,他们是朋友,但我没有成功 我有这
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
最后,我应该从likes表中删除这两个元组:
1911-1247
1641-1468
他们是非互惠的,也是朋友试试这个
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);
您的错误是因为需要在第二个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
虽然这并不完全是在查询中查找错误,但我会这样做:
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
);
请注意,在“喜欢”和“朋友”中,朋友A和B的顺序可能不同,所以我们需要像我一样加入“使用”或“或”语句 由于您正在为这个问题学习斯坦福大学的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))
你使用的是mysql还是sqlite?你的意思是,如果两个学生A和B是朋友,A喜欢B,但B不喜欢,我想删除朋友元组。?使用存在,你不会再犯这个错误。我尝试过,但它不起作用。。我编辑了我的帖子,以包含带有实际值和预期结果的表。您可以为此创建一个SQLFIDLE吗?我尝试了,但没有成功。。我编辑了我的帖子,将表格中包含了实际值和预期结果。我希望你能看到这个想法。首先找到所有喜欢的。然后找到所有喜欢的朋友。然后搜索所有朋友喜欢的人,包括这次丢失的结果。然后是where子句,只返回缺少最后一个喜好的结果。我尝试了一下,结果不起作用。。我编辑了我的帖子,以包含带有实际值和预期结果的表格——我尝试了,但没有成功。。我编辑了我的帖子,以包含带有实际值和预期结果的表格