2011-02-11 3 views
0

Salutations et merci d'avoir regardé ma question, j'espère que vous pouvez fournir un aperçu ou une direction.Requêtes conditionnelles parmi plusieurs tables

J'ai trois tables (fondamentalement): 'valeur_meta', 'valeur' ​​et 'valeurs_visibilité'. Le schéma suit:

TABLE 'value_meta' 

COMMENT: contains a list of different values, each referencing a different 'value' table 

int id PK 

tinyint value1 FK to value1.value 

tinyint value2 FK to value2.value 

tinyint value3 FK to value3.value 

... 



TABLE 'value' 

COMMENT: there are different value tables (for example, if it were for user profile data, there would be a value table for "occupation", "body type", and/or "education level" 

tinyint id PK 

varchar(255) value 



TABLE 'value_visibility' 

COMMENT: one value visibility entry per value[n] in the 'value_meta' table, each a boolean value. If 1, the coding query will return the value as rerefenced in 'value[n]' table. if 0, return null 
int id PK 

BOOLEAN 'value1_visibility' 

BOOLEAN 'value2_visibility' 

BOOLEAN 'value3_visibility' 

.... 

Ce que je veux faire est de créer une requête MySQL appropriée pour vérifier « pour chaque « valeur » dans « value_meta », si l'entrée de valeur correspondante dans « value_visibility » est 1, la valeur d'affichage varchar. sinon renvoie null ". Par le bon je veux le rendre le plus efficace (tables dédaignées contre sous-requêtes corrélées, conditions appropriées et utilisations de fonction ... j'entends que ISNULL est mauvais). J'avais l'habitude d'être bon dans la construction de requêtes tout droit sorti de mon esprit au collège, mais après des années de ne pas l'utiliser, je suis devenu trois pailles à court d'un balai complet. Quelqu'un peut-il m'aider? Merci!

+0

Où avez-vous entendu que 'ISNULL' est mauvais? –

Répondre

0
SELECT vm.id, 
    IF(vv.id IS NULL, NULL, vm1v.value) value1, 
    IF(vv.id IS NULL, NULL, vm2v.value) value2, 
    IF(vv.id IS NULL, NULL, vm3v.value) value3 
FROM value_meta vm 
    LEFT JOIN value vmv1 ON vm.value1 = vmv1.id 
    LEFT JOIN value vmv2 ON vm.value1 = vmv2.id 
    LEFT JOIN value vmv3 ON vm.value1 = vmv3.id 
    LEFT JOIN value_visibility vv ON vm.id = vv.id AND vv.value1_visibility = 1 

Vous devriez penser à restructurer votre table value_meta, est-il une raison pour laquelle vous stockez valeur1 2 et 3 dans la même ligne?

+0

Parfait, je suis beaucoup plus près d'être sur la bonne voie maintenant. Et merci pour la réponse rapide. La table 'value_meta' contient une clé primaire unique aux différents contextes. Donc revenons au profil hypothétique, chaque rangée serait les données d'un utilisateur différent à la figure, la profession et/ou le niveau d'éducation. – BlackHat

Questions connexes