2011-10-31 14 views
0

に参加するための列の値を使用して、私は次のようになります3つのテーブルがあります。MySQLの - 同じクエリ

joins

|ID|JOIN_NAME| 
1 persons 
2 companies 

information

|ID|JOIN_ID| 
1 1 
2 2 

information_extra_persons

|ID|INFORMATION_ID|NAME| 
1 1    John 

私は1つのSQLで一緒にこれらのテーブルを結合することができますどのように表information_extra_companies

|ID|INFORMATION_ID|NAME| 
1 2    IBM 

?私は次のようなものを試しました:

SELECT * FROM `information` 
INNER JOIN `information_extra_(SELECT `name` FROM `joins` WHERE `id` = `join_id`)` 
ON `information_extra_(SELECT `name` FROM `joins` WHERE `id` = `join_id`)`.`information_id` = `information`.`id` 

私はそれを働かせることはできません。もちろん、これは私の実際のテーブル設定ではありませんが、同じ原則です。誰もが1つのSQLですべての情報を取得する方法を知っていますか?

+1

JOINを動的にする必要がある場合は、SQLはこれを行うことができないため不可能です。 – Yahia

答えて

3

実際には3つではなく4つのテーブルです。これはちょうどニンピクではありません - あなたの質問の内容は、 "テーブルの名前を結合基準の一部としてどのように使用できますか? (すなわち、information_extra_テーブルをどのように単一のテーブルとして扱うことができますか?)

答えは次のとおりです。また

select j.join_name joined_entity, 
     case when j.join_name = 'persons' then p.name 
      else c.name 
     end joined_entity_name 
from information i 
inner join joins j on i.join_id = j.id 
left join information_extra_persons p on i.id = p.information_id 
left join information_extra_companies c on i.id = c.information_id 

、あまり効率的な(しかし、より一般的な)アプローチがあるかもしれない:(動的SQLの外で)

この特定場合は、次のように私はあなたが探していると思うものを返す必要があります:

select j.join_name joined_entity, 
     v.name joined_entity_name 
from information i 
inner join joins j on i.join_id = j.id 
inner join (select 'persons' entity, information_id, name from information_extra_persons 
      union all 
      select 'companies' entity, information_id, name from information_extra_companies) v 
      on i.id = v.information_id and j.join_name = v.entity 
関連する問題