2013-07-30 18 views
5

私はMySQLの新機能です。私は正しいことを確信していません。助けが必要。テーブルを動的に結合するMySQL

id, source_type, source_id, survey_date_time

は、私はテーブルの次の列を持つsurveyを持っています。

他の二つの表は以下のとおりです。id, col1, col2, col3列が

education

gamesid, col4, col5, col6カラムを有する。 surveyテーブルで

データ:

id  source_type source_id survey_date_time 
-------------------------------------------------------- 
100  education   1   2013-07-25 00:00:00 
101  games    1   2013-07-25 00:00:00 
102  games    2   2013-07-26 00:00:00 
103  education   2   2013-07-26 00:00:00 

データeducationテーブル内gamesテーブルで

id col1   col2   col3  
-------------------------------------------- 
1  col1_data1 col2_data1 col3_data1 
2  col1_data2 col2_data2 col3_data2 

データ

id col4   col5   col6  
-------------------------------------------- 
1  col4_data1 col5_data1 col6_data1 
2  col4_data2 col5_data2 col6_data2 

私はデータDYを読みたいですnamicallyのように:

select * from survey left join {survey.sorce_type} on {survey.sorce_type}.id=survey.source_id where survey.id={given_id}

あなたは、スキーマに事前にhere

感謝を見つけることができます。

UPDATE:

SELECT * 
    FROM survey s 
    LEFT JOIN eduction e ON s.source_type = 'education' AND e.id = s.source_id 
    LEFT JOIN games g ON s.source_type = 'games' AND g.id = s.source_id 

SQLフィドルはhereです: select文は、これはあなたが探しているものを達成する必要がありsurvey.*, {survey.sorce_type}.*代わりの*

おかげ

+0

技術的には、動的SQLを使用する必要があります。つまり、MySQLのPrepared Statement構文 – Jivan

答えて

6

になります。

本質的に、source_typeに基づく適切なテーブルが結合されます。したがって、educationの場合はeductionテーブルに結合します(スペルミスがある可能性があります)。gamesの場合はgamesテーブルに追加されます。

+1

は現在2つのテーブルを持っています。教育、ゲーム。将来的にはもっと多くのテーブルがあります。だから私は各テーブルの結合を追加することはできません。 –

+0

テーブル構造を再設計する必要があります。 survey_data:survey_type_id、col1、col2、col3、col4、col5、col6。 survey_type:id、type_name。調査:id、survey_type_id、survey_data_id、date_created。 – AEQ

+0

@AEQあなたはもう少し提案しているアプローチを説明できますか? – antoniovassell

1

このためには、プリペアドステートメントを使用してプロシージャを作成する必要があります。

DELIMITER | 
CREATE PROCEDURE `JoinWithSurvey`(param_leftTable VARCHAR(50), param_id VARCHAR(10)) 
BEGIN 
SET @QUERY1 = concat('select survey.*,',param_leftTable,'.* from survey left join ',param_leftTable,' on ',param_leftTable,'.id=survey.source_id where survey.id = ', param_id ,';'); 
PREPARE stmt FROM @QUERY1; 
EXECUTE stmt; 
DEALLOCATE PREPARE stmt; 
END | 

その後、私はあなたが同様に整数型として使用することができます。..ここでvarchar型としてIDを渡す

call JoinWithSurvey('eduction','100'); 

ID SOURCE_TYPE SOURCE_ID SURVEY_DATE_TIME COL1 COL2 COL3 
100 education 1 July, 25 2013 00:00:00+0000 col1_data1 col2_data1 col3_data1 

call JoinWithSurvey('games','102'); 

ID SOURCE_TYPE SOURCE_ID SURVEY_DATE_TIME COL4 COL5 COL6 
102 games 2 July, 26 2013 00:00:00+0000 col4_data2 col5_data2 col6_data2 
102 education 2 July, 26 2013 00:00:00+0000 col4_data2 col5_data2 col6_data2 

そのSPを呼び出します。..:)

Working fiddle here

+0

ありがとう。しかし、私はテーブル名( 'source_type'です)を渡す必要がないソリューションはありますか?私は 'survey'テーブル' id'を渡したいだけです。テーブルは 'source_type'の' survey'と動的に結合します。 –

+1

システムに参加を指示しない限り、これらすべてのテーブルに参加する必要があることをシステムがどのように知るか。 ?別の解決策は、Martin Parkinが既に指し示しています。そこでは、すべてのテーブルに移動して参加する必要があります。あなたが私の要点を持っているといいなあ –

+0

'source_type'カラムはテーブル名です。もし私がIDを持っていたら、私は 'source_type'カラムの表形式を見つけることができます。 –

0

あなたは、あなたが列が同じである場合は、再利用することができ、より多くの調査の種類を追加できるようになるテーブル構造を再設計することができ試してみます列ではなく場合は、nullデータは非常に小さなスペースを使用しています(参考文献:NULL in MySQL (Performance & Storage)

SQLのフィドル:http://sqlfiddle.com/#!2/76889/3

関連する問題