我是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
我想动态地读取数据:
select * from survey left join {survey.sorce_type} on {survey.sorce_type}.id=survey.source_id where survey.id={given_id}
您可以找到架构here
提前致谢。
更新:
select语句将为survey.*, {survey.sorce_type}.*
而不是*
由于
答案 0 :(得分: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 :(得分: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 |
然后调用sp
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
我在这里传递了id作为varchar ..你也可以使用整数类型..:)
试一试
的 Working fiddle here 强> 的
答案 2 :(得分:0)
您可以重新设计表结构,然后允许您添加更多调查类型,如果列相同,则可以重复使用列,但如果没有,则空数据使用的空间非常小(参考:NULL in MySQL (Performance & Storage) )