0

わかりました、少し奇妙なシナリオがあります。データベース構造を変更する権限がないため、データベース構造を変更できません。問題のために、私は3つのテーブルを持っています

表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       

ここで説明します: inは または のいずれかのフィールドであり、table 1表2または 3 にリンクされているかどうかを示します。link_ididtable 2table 3link_to

次に、3 つのテーブルすべてから結合されたデータをフェッチして、 の各nameフィールドに対して、その行の link_id フィールドと link_to フィールドで定義された正しいテーブルからフィールドtable 1を取得する必要があります。data

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

4

2 に答える 2

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
)
于 2012-04-05T06:04:57.923 に答える
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');
于 2012-04-05T07:59:25.500 に答える