2016-06-26 13 views
1

Ich habe diese einfachen Tabellen:MySQL: Boolean Abfrage gibt true zurück, wenn der Benutzer dnd nicht gesetzt hat, oder wenn Benutzer dnd gegeben ID muss ein Freund gesetzt hat sein

1. USER_DND 
╔════════╦══════╗ 
║ UserID ║ DnD ║ 
╠════════╬══════╣ 
╚════════╩══════╝ 

2. USER_FRIEND 
╔════════╦══════════╗ 
║ UserID ║ FriendID ║ 
╠════════╬══════════╣ 
╚════════╩══════════╝ 

USER_DND: Es enthält IDs von Benutzern und deren nicht stören (Dnd) Flagge. UserID ist eine Ganzzahl und ist der Primärschlüssel. DnD ist boolesch.

USER_FRIEND: Es enthält IDs von Freunden von Benutzern. UserID und FriendID beide sind Integer.

Problem:

Für UserID und FriendID Ich mag gegeben ein einzelne Abfrage Rückkehr boolean (SELECT CASE WHEN EXISTS) schreiben, die wahre in eines des Fall zurückzugibt:

Wenn gegeben UserID DnD hat Falsch setzen in USER_DND

ODER

Wenn gegeben UserID hat DnD Satz wahr in USER_DND und gegeben FriendID existiert in USER_FRIEND für das UserID

Zusätzlich:

Diese beiden sind Tabellen mit einer großen Anzahl von Zeilen. Abfrage muss sehr schnell sein. Daher bevorzuge ich nicht die Verwendung von OR in where clause of query oder query having subqueries. Beide haben strenge Leistungsstrafen.

+0

entfernen kann ich nicht verstehen, die Logik der zweiten Bedingung macht es nicht viel Sinn. 'FriendID' existiert nur in' USER_FRIEND', also wie kann das nicht sein? – sagi

+0

Wie sieht Ihre SHOW CREATE TABLE für diese aus? Der Schlüssel zur Performance sind Indizes. – tadman

+0

@sagi: Frage aktualisiert, um es klarer zu machen. Bitte überprüfe es jetzt. Vielen Dank. – Atul

Antwort

2

können Sie versuchen, LEFT JOIN mit:

SELECT MAX(CASE WHEN ud.dnd = 'FALSE' THEN 'TRUE' 
       WHEN uf.FriendID = YourGivenFriendID THEN 'TRUE' 
       ELSE 'FALSE' 
      END) as user_ind 
FROM USER_DND ud 
LEFT JOIN USER_FRIEND uf 
ON(ud.userID = uf.userID) 
WHERE uf.userID = YourGivenID 

ich jeder Benutzer angenommen mehrere Freunde haben kann, damit die MAX(), wenn seine 1-1, können Sie die MAX()

+0

Hervorragende Lösung :) – Atul