2012-04-05 22 views
0

私はちょっと変わったシナリオを持っています。私はその許可を得ていないので、データベース構造を変更することはできません。問題のために、私は3つのテーブルこのシナリオでは、複数のmysqlテーブルからデータを選択する方法はありますか?

表1-

id(int) | name(varchar) | link_id(int) | link_to(tinyint) 
.............................................................. 
    1  | value1  | 1   | 2 
    2  | value2  | 3   | 2 
    3  | value3  | 1   | 3 
    4  | value4  | 2   | 3 
    5  | value5  | 3   | 3 

テーブル2-

id(int) | data(varchar) 
............................ 
    1  | some1  
    2  | some2  
    3  | some3  

テーブル3-

id(int) | data(varchar) 
............................ 
    1  | another1  
    2  | another2  
    3  | another3  

は、今私が説明しましょう:table 1に、link_idtable 2またはtable 3のいずれかのidフィールドであり、それは表2または3

にリンクされているかどうかlink_to状態は今、私はそのようなすべての3つのテーブルからの組み合わされたデータをフェッチする必要があります各nameフィールドのtable 1には、その行のlink_idフィールドとlink_toフィールドで定義されている正しいテーブルのdataフィールドがあります。

これを達成するためのmysqlクエリはありますか?

答えて

3

私は受け入れ答えに同意UNION

(
SELECT t1.id,t2.data 
FROM table1 t1 
    INNER JOIN table2 t2 ON t1.link_id=t2.id AND t1.link_to=2 
) UNION (
SELECT t1.id,t3.data 
FROM table1 t1 
    INNER JOIN table3 t3 ON t1.link_id=t3.id AND t1.link_to=3 
) 
0

と試みることができます。 ストアドプロシージャを作成し、検索を許可することもできます。

# stored procedure 
DELIMITER $$; 
CREATE PROCEDURE `search_by_value`(
    in_searchValue VARCHAR(255) 
) 
BEGIN 
    DECLARE jointable INTEGER; 

    SELECT link_to INTO jointable FROM table1 WHERE name = in_searchValue; 
    IF (jointable = 2) THEN 
    SELECT * FROM table1 t1 left join table2 t2 on t1.link_id = t2.id WHERE t1.name = in_searchValue; 
    ELSEIF (jointable = 3) THEN 
    SELECT * FROM table1 t1 left join table3 t3 on t1.link_id = t3.id WHERE t1.name = in_searchValue; 
    END IF; 
END $$ 
DELIMITER; 

# call the sp 
call search_by_value('value1'); 
関連する問題