2016-06-28 45 views
-1

我正在创建一个聊天应用程序,用于查询加载的SQL表,以便在datagridview中显示用户当前的朋友列表。我遇到的问题是当前用户也出现在朋友列表中。在查询结果中返回自己的用户名的SELECT查询

该表的布局是:

create table Friendships 
(
FriendshipID int IDENTITY(100,1) Primary Key, 
ReceiverID int, 
SenderID int, 
Approved bit, 
) 

当某人发送一个请求,一个排在表中创建了自己的Sender ID和个人ID他们把它作为ReceiverID,它是如果有人向朋友发送朋友请求,则“相反”,并且“已批准”设置为0,直到接收方接受朋友请求。为了填充datagridview,我需要查询表并返回当前用户是发送者或接收者的所有记录,并显示他们是谁的朋友。每个关系只需要显示一次。

一个我试图查询的是:

SELECT UserID, Username, Status 
FROM Arwen_Friendships, Arwen_Users 
WHERE ReceiverID = UserID 
OR SenderID = UserID 
AND ReceiverID = @Current_User_ID 
OR SenderID = @Current_User_ID 
AND Approved =1 

其中@Current_User_ID使用登录用户的ID当前参数。我尝试了所有方式的连接,SELECT DISTINCT和子查询,但都没有运气。上述查询的结果返回两行:一个包含登录的用户信息,另一个包含发送者或接收者的ID,并完全忽略“Approved = 1”。它将返回“Approved = 0”的行。

+0

您应该检查您的where子句中的操作顺序,它不清楚实际情况或操作顺序。 –

+0

绝对检查你的操作顺序,并理解使用'()'和'(())'时的'Where和How'如何组合AND和OR语句你可以包装所有的' Sql是我会建议也学会使用'表别名'如何有人应该知道哪些表的ID是从你的WHERE子句.. ??? – MethodMan

+0

为什么在表格末尾有一个额外的逗号创建'Approved bit',' – MethodMan

回答

1

使用UNION ALL

(SELECT U.UserID, 
     U.Username, 
     U.Status 
    FROM Arwen_Friendships AF INNER JOIN 
     Arwen_Users U ON AF.SenderID = U.UserID 
    WHERE AF.ReceiverID = @Current_User_ID AND 
     AF.Approved = 1) 

    UNION ALL 

(SELECT U.UserID, 
     U.Username, 
     U.Status 
    FROM Arwen_Friendships AF INNER JOIN 
     Arwen_Users U ON AF.ReceiverID = U.UserID 
    WHERE AF.SenderID = @Current_User_ID AND 
     AF.Approved = 1) 
+1

不需要联合所有个人说话OP应该学会不使用'Poor Man Joins'并使用适当的'INNER JOIN'来过滤结果 – MethodMan

+0

这工作完美。谢谢。几天之后,我一直在墙上撞着我的头。 –

+0

np乐意为您效劳 –

0

试试看。

SELECT UserID, Username, Status 
from Arwen_Friendships, Arwen_Users 
WHERE (ReceiverID = UserID OR SenderID = UserID) 
    OR (ReceiverID = @Current_User_ID OR SenderID = @Current_User_ID) 
    AND (Approved = 1) 
1

只是要小心,你如何组织你AND/OR是

SELECT UserID, Username, Status 
FROM Arwen_Friendships, Arwen_Users 
WHERE ReceiverID = UserID 
    OR (SenderID = UserID AND ReceiverID = @Current_User_ID) 
    OR (SenderID = @Current_User_ID AND Approved =1) 
0

没有括号所有,并处理后的第一
可以得到批准= 0,因为Or最后完成

SELECT UserID, Username, Status 
FROM Arwen_Friendships, Arwen_Users 
WHERE (ReceiverID = UserID OR SenderID = UserID) 
    AND (ReceiverID = @Current_User_ID OR SenderID = @Current_User_ID) 
    AND Approved =1