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.
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
Wie sieht Ihre SHOW CREATE TABLE für diese aus? Der Schlüssel zur Performance sind Indizes. – tadman
@sagi: Frage aktualisiert, um es klarer zu machen. Bitte überprüfe es jetzt. Vielen Dank. – Atul