Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
动态连接表MySQL_Mysql_Jointable - Fatal编程技术网

动态连接表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

我是MySQL的新手。我不确定我是对的。我需要帮助

我有一个表
调查
,它有以下列:

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
列中找到表。