2016-06-28 40 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