2013-07-30 4 views
5

Я новичок в MySQL. Я не уверен, что я прав. Нужна помощь.Динамически соединяет таблицу MySQL

У меня есть таблица survey, которые имеют следующий столбец:

id, source_type, source_id, survey_date_time.

Другие две таблицы:

education которые имеют id, col1, col2, col3 столбцы.

games которые имеют id, 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

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

данные в таблице games

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

Я хочу читать д данных namically нравится:

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

Вы можете найти в схеме here

Спасибо заранее.

UPDATE: оператор выбора будет survey.*, {survey.sorce_type}.* вместо *

Благодаря

+0

Технически вам нужно использовать Dynamic SQL, что означает синтаксис подготовленного синтаксиса MySQL – Jivan

ответ

6

Это должно сделать то, что вы ищете:

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.

По существу, это присоединяется к соответствующей таблице на основе source_type. Поэтому, когда это education, он присоединяется к таблице eduction (возможно, у вас может быть орфографическая ошибка), а когда она games, она присоединяется к таблице games.

+1

, в настоящее время у меня есть две таблицы. образование, игры. но в будущем будет больше таблицы. поэтому я не могу добавить соединение для каждой таблицы. –

+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 | 

Тогда зови, что СП

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 

Я передал идентификатор как VARCHAR здесь .. Вы можете использовать как целое число типа, а также ..:)

У попробовать

Working fiddle here

+0

Спасибо. Но есть ли какое-то решение, где мне не нужно передавать имя таблицы (которое является 'source_type')? Я просто хочу передать таблицу 'survey'' id'. Таблица будет динамически объединяться с 'survey' из' source_type'. –

+1

Как система узнает, что вам нужно присоединиться к этим таблицам, если вы не сказали системе присоединиться. ?. Альтернативное решение уже указано Мартином Паркином, где вам нужно сказать всем столам, чтобы пойти и присоединиться. Надеюсь, ты понял. –

+0

Столбец 'source_type' - это имя таблицы. Если бы у меня был идентификатор, я могу найти таблицу в столбце 'source_type'. –

0

Вы можете перестроить структуру таблицы, которая затем позволит вам добавить больше типов съемки, если столбцы одинаковы, то вы можете использовать столбцы, но если нет, то нулевые данные используются очень мало места (Ref: NULL in MySQL (Performance & Storage))

SQL скрипку: http://sqlfiddle.com/#!2/76889/3

Смежные вопросы