2016-06-28 5 views
-1

私は、SQLテーブルを読み込んでSQLテーブルを照会し、ユーザーの現在の友人のリストをdatagridviewに表示するチャットアプリケーションを作成しています。私が持っている問題は、現在のユーザーが友達リストにも表示されることです。結果に自分のユーザー名を返すSELECTクエリ

テーブルのレイアウトは次のとおりです。

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

誰かが要求を送信すると、行はSENDERIDとReceiverID、そのまま彼らはそれを送った人のように自分のIDを持つテーブルに作成されます誰かがその人にフレンドリクエストを送信した場合、その反対であり、受信者がフレンドリクエストを受け入れるまで、「Approved」は0に設定されます。 datagridviewにデータを入れるには、テーブルを照会して、現在のユーザーが送信者または受信者のいずれかであるすべてのレコードを返し、友人である人物を表示する必要があります。各関係は1回だけ表示する必要があります。私が試したクエリの

一つでした:@Current_User_IDは、ユーザのIDでログインして電流を使用してパラメータ化され

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 

。私はすべての方法の結合、SELECT DISTINCT、およびサブクエリを無駄なく試しました。上記のクエリの結果は、ログインしたユーザーの情報を持つものと、IDが送信者または受信者のものを持つものの2つの行を返し、「承認済み= 1」を完全に無視します。 "Approved = 0"の行を返します。

+0

where句に関する操作の順序、実際の条件がわからない、または操作の順序が実際にどのようなものかを確認する必要があります。 –

+0

オペレーションの順序を確かめ、ANDとOR文を組み合わせるときに '()'と '())'を使う場所と方法を理解しておいてください。 SQLは、私が 'テーブルエイリアスを使用する方法を学ぶことをお勧めします'誰があなたのWHERE節でIDのテーブルが何であるか知っていると思いますか? – MethodMan

+0

なぜあなたのテーブルの最後にカンマがあるのですか?承認ビットを作成します。 – MethodMan

答えて

1

使用連合のすべて

(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

個人的にはすべてOPENする必要はありませんが、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

はちょうどあなたがあなたの構造および/またはだ方法について注意する括弧なし

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が最後に行われたために0です。

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 
関連する問題