2016-08-07 40 views
1

ich in der folgenden Tabelle haben:Wertprüfung direkt in der Abfrage mit MySQL

Freunde:

id | user1 | user2 | status 
1 | Jorge | Alisson | 3 
2 | Lucas | Jorge | 3 

Und ein SELECT zu tun, ich tun (die Variable $userLogged dem Benutzer bezieht sich angemeldet zu der Zeit in):

SELECT user1, user2, status 
FROM friends 
WHERE user1 = '$userLogged' OR user2 = '$userLogged' 

Also, in PHP:

foreach($query as $q) { 
    if($q["user1"] == $userLogged) { 
     $userFriend = $q["user2"]; 
    } else { 
     $userFriend = $q["user1"]; 
    } 
} 

Angenommen, die $userLogged ist Jorge. Ich möchte den Freund bekommen ($userFriend), das heißt, das ist nicht $userLogged (Alisson und Lucas, für den Fall). Momentan mache ich diese Überprüfung in der oben gezeigten Weise mit PHP. Wie kann ich das direkt in der Abfrage machen und so diese Prüfung in PHP speichern? Für ex .: SELECT user1 AND user2 <> '$userLogged' AS userFriend ...

+0

Gibt es eine Benutzertabelle? Ich hätte Freunde userid, freuidid. Dann könntest du leicht einen Beitritt für alle von Jorges Freunden machen. Auf diese Weise müssen Sie einen Self-Join durchführen und wenn Sie Benutzer mit demselben Namen haben, gibt es keine Möglichkeit, sie zu unterscheiden. – chris85

Antwort

1
SELECT 
CASE WHEN user1 = '$userLogged' THEN user2 
ELSE user1 END AS userFriend 
FROM friends 
WHERE user1 = '$userLogged' OR user2 = '$userLogged' 
+0

Es hat funktioniert! Aber wie kann ich 'userFriend' in einer ON-Klausel verwenden? Wie: 'Freunde INNER JOIN Benutzer ON userFriend = Benutzer', weil ich:' Spalte nicht gefunden: 1054 Unbekannte Spalte 'userFriend' in 'on Klausel'' – Igor

+1

Setzen Sie einfach die CASE-Anweisung in die ON-Anweisung. SELECT ... VON Freunde INNER JOIN Blah ON CASE WHEN 'userLogged $' user1 = DANN benutzer2 ELSE benutzer1 END = unabhängig WHERE user1 = '$ userLogged' OR '$ userLogged' –

+0

Perfekt benutzer2 =! Vielen Dank! – Igor

2

Wenn Sie einen Index für friends(user1, user2, status) und friends(user2, user1, status) haben, dann ist der schnellste Weg:

SELECT user2 as `user`, status 
FROM friends 
WHERE user1 = '$userLogged' 
UNION ALL 
SELECT user1, status 
FROM friends 
WHERE user2 = '$userLogged'; 

Der Index kann für beide Unterabfragen verwendet werden, so sollte dies sei sehr schnell.