2016-06-28 2 views
-1

Ich erstelle eine Chat-Anwendung, die eine SQL-Tabelle beim Laden abfragt, um eine Liste der aktuellen Freunde des Benutzers in einer Datagridview anzuzeigen. Das Problem, das ich habe, ist der aktuelle Benutzer erscheint auch in der Freundesliste.SELECT-Abfrage, die eigenen Benutzernamen in Ergebnissen zurückgibt

Das Layout für die Tabelle ist:

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

Wenn jemand eine Anfrage sendet, wird eine Zeile in der Tabelle mit ihrer ID als SenderID und der Person, erstellt sie ihm geschickt, wie die ReceiverId und es ist das Gegenteil, wenn jemand dieser Person eine Freundschaftsanfrage sendet, und "Approved" wird auf 0 gesetzt, bis der Empfänger die Freundschaftsanfrage annimmt. Um den Datagridview aufzufüllen, muss ich die Tabelle abfragen und alle Datensätze zurückgeben, in denen der aktuelle Benutzer entweder der Absender oder der Empfänger ist, und die Person anzeigen, mit der sie befreundet sind. Jede Beziehung muss nur einmal angezeigt werden.

Einer der Anfragen habe ich versucht war:

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 

wo @Current_User_ID parametriert wird, um den Strom in Benutzer-ID angemeldet werden. Ich habe alle Arten von Verknüpfungen, SELECT DISTINCT und Unterabfragen ohne Glück versucht. Das Ergebnis der obigen Abfrage gibt zwei Zeilen zurück: eine mit den Informationen des angemeldeten Benutzers und eine mit der Person, deren ID der Absender oder der Empfänger ist, und ignoriert vollständig "Approved = 1". Es wird Zeilen mit "Approved = 0" zurückgegeben.

+0

Sie sollten Ihre Reihenfolge der Operationen auf der WHERE-Klausel überprüfen, es ist unklar, was die Bedingung tatsächlich ist oder wie die Reihenfolge der Vorgänge tatsächlich ist. –

+0

Überprüfen Sie auf jeden Fall die Reihenfolge der Operationen und verstehen Sie das 'Wo und Wie'' zu verwenden'() 'vs' (()) 'beim Kombinieren von AND und OR-Anweisungen können Sie alle' AND innerhalb eines einzigen() 'ein paar grundlegende Sql ist was ich empfehlen würde auch lernen, 'Table Aliasing' zu verwenden, wie soll jemand wissen, aus welcher Tabelle die IDs in Ihrer WHERE-Klausel stammen. ??? – MethodMan

+0

Warum gibt es ein zusätzliches Komma am Ende Ihrer Tabelle erstellen 'Genehmigte Bit,' – MethodMan

Antwort

1

Verwenden Union alle

(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

keine Notwendigkeit, alle persönlich sprechen das OP sollte lernen, nicht verwenden "Armer Mann Joins" und richtige 'INNER JOIN', um die Ergebnisse zu filtern – MethodMan

+0

Das hat perfekt funktioniert. Vielen Dank. Ich habe meinen Kopf ein paar Tage über die Wand geschlagen. –

+0

np glücklich, Ihnen zu helfen –

0

Probieren Sie es aus.

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

Nur vorsichtig sein, wie Sie Sie Struktur und/oder ist

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

Ohne paren alle Und werden zuerst verarbeitet
Sie genehmigt bekommen können = 0 weil die Oder zuletzt erfolgt sind

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