5

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

我有一个表survey,其中包含以下列:

id, source_type, source_id, survey_date_time.

其他两个表是:

educationid, col1, col2, col3列。

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表中数据

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}

您可以在此处找到架构

提前致谢。

更新: 选择语句将survey.*, {survey.sorce_type}.*代替*

谢谢

4

3 回答 3

7

这应该完成您正在寻找的内容:

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 在这里

本质上,这会基于source_type. 所以当它education连接到eduction表时(你可能在那里有拼写错误),当games它连接到games表时。

于 2013-07-30T09:17:58.377 回答
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 传递..您也可以用作整数类型.. :)

试试

在这里工作小提琴

于 2013-07-30T09:56:12.643 回答
0

您可以重新设计表结构,然后允许您添加更多调查类型,如果列相同,那么您可以重用列,但如果不是,则空数据使用很少的空间(参考:MySQL 中的 NULL(性能和存储) )

SQL小提琴:http ://sqlfiddle.com/#!2/76889/3

于 2015-05-27T10:06:58.920 回答