动态连接表MySQL
我是MySQL的新手。我不确定我是对的。我需要帮助 我有一个表动态连接表MySQL,mysql,jointable,Mysql,Jointable,我是MySQL的新手。我不确定我是对的。我需要帮助 我有一个表调查,它有以下列: id、源类型、源id、调查日期时间 其他两个表格为: education具有id、col1、col2、col3列 游戏有id、col4、col5、col6列。 调查表中的数据: id source_type source_id survey_date_time -------------------------------------------------------- 100
调查
,它有以下列:
id、源类型、源id、调查日期时间
其他两个表格为:
education
具有id、col1、col2、col3
列
游戏
有id、col4、col5、col6列。
调查
表中的数据:
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
教育
表中的数据
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
游戏
表格中的数据
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
我希望动态读取数据,如:
select*from survey left join{survey.sorce_type}上的{survey.sorce_type}.id=survey.source_id,其中survey.id={given_id}
您可以在模式中找到
提前谢谢
更新:
select语句将是survey.*.{survey.sorce\u type}.*.
而不是*
谢谢这应该可以满足您的需求:
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 Fiddle是一个很好的工具
本质上,这将基于
源类型
连接相应的表。因此,当它是education
时,它会连接到education
表(您可能在那里有拼写错误),当它是games
时,它会连接到games
表。为此,您需要创建一个带有准备语句的过程
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
我在这里以varchar的身份传递id。。您也可以将其用作整数类型:)
试一试
您可以重新设计表格结构,然后允许您添加更多调查类型,如果列相同,则可以重用列,但如果不相同,空数据使用的空间非常小(参考:)
SQL fiddle:目前我有两个表。教育,游戏。但将来会有更多的桌子。所以我不能为每个表添加联接。您必须重新设计表结构。。。e、 g.调查数据:调查类型id、col1、col2、col3、col4、col5、col6。调查类型:id,类型名称。survey:id,survey\u type\u id,survey\u data\u id,date\u created。@AEQ您能解释一下您建议的方法吗?我已经有一段时间没有看到这个了,但我认为这就是我所想的@Antoniovasell:从技术上讲,您需要使用动态SQL,这意味着MySQL准备好的语句语法。但是有什么解决方案不需要传递表名(即
source\u type
)吗?我只想通过调查
表格id
。该表将与源类型中的调查
动态联接。除非您告诉系统要联接,否则系统如何知道您需要联接这些所有表?。Martin Parkin已经指出了另一种解决方案,您需要告诉所有表去加入。希望你明白我的意思。source\u type
列是表名。如果我有id,那么我可以从source\u type
列中找到表。