2016-06-26 1 views
1

J'ai ces tables simples:MySQL: requête booléenne renvoyant true si l'utilisateur n'a pas le DND ou si l'utilisateur a mis en ID DND donné doit être un ami

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

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

USER_DND: Il contient les ID des utilisateurs et leur Ne pas déranger (Dnd). UserID est un nombre entier et est la clé primaire. DnD est un booléen.

USER_FRIEND: Il contient les ID des amis des utilisateurs. UserID et FriendID sont tous les deux des entiers.

Problème:

Pour donné UserID et FriendID Je veux écrire un qui retourne vrai dans l'un des cas booléen retour simple de requête (SELECT CASE WHEN EXISTS):

Si UserID donné a DnD définir false dans USER_DND

OU

Si UserID donné a DnD ensemble vrai dans USER_DND et donné friendID existe dans USER_FRIEND pour que UserID

supplémentaires:

Ces deux tables sont avec un grand nombre de lignes. La requête doit être très rapide. Donc, je ne préfère pas utiliser OR in where clause of query ou query having subqueries. Les deux ont des pénalités de performance sévères.

+0

Je ne comprends pas la logique de la deuxième condition, cela n'a pas beaucoup de sens. 'FriendID' existe seulement dans' USER_FRIEND', alors comment ça ne peut pas? – sagi

+0

À quoi ressemble votre 'SHOW CREATE TABLE'? La clé de la performance est les index. – tadman

+0

@sagi: Question mise à jour pour le rendre plus clair. S'il vous plait verifiez maintenant. Merci. – Atul

Répondre

2

Vous pouvez essayer d'utiliser LEFT JOIN:

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 

Je suppose que chaque utilisateur peut avoir plusieurs amis, donc le MAX(), si son 1-1, vous pouvez supprimer le MAX()

+0

Superbe solution :) – Atul