我正在努力寻找能够让某些成员不是朋友的成员的查询。这是我的表的布局:
member_login:
MemberID, email, password
member_info:
memberID, first_name, last_name
member_friends:
friendID, req_member, req_date, app_member, app_date, date_deactivated
我尝试使用NOT IN来运行一个返回朋友对面的查询,但我尝试的任何东西似乎都没有用。这就是我认为可行的方法:
SELECT Mi.First_Name, Mi.Last_Name
FROM Member_Info Mi
WHERE Mi.Memberid NOT IN(
SELECT Mi.Memberid, Mi.First_Name, Mi.Last_Name
FROM Member_Info Mi, Member_Login Ml, Member_Friends Mf
WHERE Mi.Memberid = Ml.Memberid
AND (Mi.Memberid = Mf.Req_Member
AND Mf.App_Member = 1
OR Mi.Memberid = Mf.App_Member
AND Mf.Req_Member =1)
AND Ml.Date_Deactivated <= 0
AND Mf.App_Date > 0
);
有什么想法吗?
答案 0 :(得分:1)
@Thedirktastik,请检查IN
子句的正确用法。在the MSDN中,您可以查看一下。
在您使用IN的WHERE
子句中,返回值的子查询应仅返回Mi.Memberid
列值。并且您的查询返回了几个不同的列。应该是这样的:
....
WHERE Mi.Memberid NOT IN(
SELECT Mi.Memberid
FROM....
答案 1 :(得分:0)
这是一个非常糟糕的设计,可能是投票率下降的原因。我将研究使member_friends表成为intersect表(联结表)。它将使您的设计和查询更容易使用和理解。
答案 2 :(得分:0)
如果你尝试
怎么办?SELECT Mi.First_Name, Mi.Last_Name
FROM Member_Info Mi
WHERE Mi.Memberid NOT IN(
SELECT Mi.Memberid
FROM Member_Info Mi, Member_Login Ml, Member_Friends
WHERE Mi.Memberid = Ml.Memberid
AND (Mi.Memberid = Mf.Req_Member
AND Mf.App_Member = 1
OR Mi.Memberid = Mf.App_Member
AND Mf.Req_Member =1)
AND Ml.Date_Deactivated <= 0
AND Mf.App_Date > 0
);
因为你在NOT IN(...)中返回三个值时应该是一个
SELECT Mi.Memberid, Mi.First_Name, Mi.Last_Name
应该是
SELECT Mi.Memberid
您可能会收到有关FROM语句的其他错误,因为您需要一起加入表来比较值,但您的朋友表没有任何匹配值,因此这可能是一个问题(设计不佳)
编辑:数据库设计
其中很多都归结为体验,但有一些好书可以查看,如Head First SQL和Relational Database Design Clearly Explained (The Morgan Kaufmann Series in Data Management Systems) (Paperback),这些都是学习基础知识和基本设计的好书,我建议你看看它们