2011-02-11 3 views
0

ご挨拶と私の質問を見ていただきありがとうございます、私はあなたがいくつかの洞察力や方向を提供できることを願っています。複数のテーブルの中の条件付きクエリ

「value_meta」、「value」、および「values_visibility」の3つのテーブルがあります(基本的に)。スキーマは、次のとおりです。

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' 

.... 

を私は何をしたい 『value_visibility』内の対応する値エントリが1であれば、 『value_meta』内の各 『価値』のための」表示値のvarchar型を確認するために、適切なMySQLのクエリを作成しています。それ以外の場合はnullを返します。適切に私はそれを最も効率的にしたい(非依存テーブル対相関サブクエリ、適切な条件と関数の使用... ISNULLが悪いと聞きます)。

私は大学で思っていたのですが、何年も使っていないうちに、完全なほうきの3つのストローになってしまいました。誰でも助けてくれますか?ありがとう!

+0

「ISNULL」はどこが悪いと聞きましたか? –

答えて

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 
あなたの value_metaテーブルの再構築を考えなければならない

、あなたが同じ行にVALUE1 2と3を格納している理由はありますか?

+0

パーフェクト、私は今、正しい軌道に近づいています。そして、迅速な対応に感謝します。 'value_meta'テーブルには、さまざまなコンテキストに固有の主キーが含まれています。したがって、仮説のプロファイルに戻ると、各行は、図、職業、および/または教育レベルの異なるユーザーのデータになります。 – BlackHat

関連する問題