2012-04-26 10 views
1

私は知的財産管理システムに取り組んでいます。私はデータベースに2つのテーブルを持っています - 商標とデザイン。MySQLの条件付きテーブル名はJOIN

私は野党のようなものを持っています。つまり、他の誰かが商標やデザインを持っていれば、私たちのクライアントのように見えますが、マネージャーは新しい異議を唱えることができます。

商標:

id 
name 

デザイン:

id 
name 

oppostion:

id 
name 
object_id 
object_table 

私にはわからない、と

例えば

、私は3つのテーブルを持っていますどのようなテーブルの反対はrelaですテッドは、私は、クエリのような種類にする可能性を持っている必要があります。

SELECT id, name, opposition_object.name FROM opposition 
LEFT JOIN (trademark|design) as opposition_object on opposition.object_id = (trademark|design).id 

まず、私は反対テーブルのobject_table列としてテーブル名を格納について考えたが、その後、私はそれがされる場合、私は知りません実現しました表名を照会することが可能であり、まず第一に、それは間違って悪い設計です。

しかし、私はここで打たれて何も私の心に来る。それで誰もそれをどう扱うか考えていますか? trademarkテーブルを結合し1つずつがdesignに参加:

答えて

3

多分何か:

SELECT 
    id, 
    name, 
    COALESCE(trademark.name,design.name) AS object_name 
FROM 
    opposition 
    LEFT JOIN trademark 
     on opposition.object_id = trademark.id 
     AND trademark.object_table ='trademark' 
    LEFT JOIN design 
     on opposition.object_id = design.id 
     AND design.object_table ='design' 
+0

おかげで、これは私が探していたまさにです! –

+0

@KuHまた、私の答えのクエリとパフォーマンスを比較してください。私は完全にはわかりませんが、同じ結果を返すクエリがより速くなければならないと感じています。 –

+1

@KuH:問題ありません。あなたが良いと思う答えに投票してください。それは私たちに暖かいぼやけた感じを与えます:P。 – Arion

0
SELECT opposition.id, opposition.name, trademark.name AS object_name 
FROM opposition 
LEFT JOIN trademark 
    ON opposition.object_id = trademark.id 
WHERE opposition.object_table = 'trademark' 

UNION 

SELECT opposition.id, opposition.name, design.name AS object_name 
FROM opposition 
LEFT JOIN design 
    ON opposition.object_id = design.id 
WHERE opposition.object_table = 'design' 

これは、2つのクエリを発行します。結果はUNIONを使用して1つの結果セットに統合されます。このような