2013-04-02 108 views
0

我必须使用limesurvey创建的表。表结构始终相同,前9个colums(id | taken | submitdate | ...)也是如此。但其余200列是动态命名的,由id,问题集ID和问题ID(即445999X180X151702)组成。可能会插入新表格,但会(现在)始终遵循此方案。我必须创建一些形式的结果表槽。我可以通过数字来引用列,但这对我来说似乎是错误的(改变问题的数量不太可能,但谁知道)。有什么不同的方法吗?如果没有,我是否至少可以创建某种映射文件,这样当我必须对表进行任何更改时,我的php应用程序将很容易更新?从具有动态列名的相同的mysql表中选择

谢谢!

编辑:不幸的是我无法控制这个表结构。这是表格由limesurvey创建的方式,因为这是我必须处理的工具。我正在寻找最好的方法:)

+3

这是一个荒谬的表结构。如果您有任何控制权,请废弃这些垃圾并使用正确的标准化设置进行重建。 –

+0

不幸的是我无法控制它。这是表格的方式,我将不得不处理它。我正在寻找最好的方法:) – Markus

+0

而不是通过数字引用列可以通过获取元数据的名称引用它们?这样你就不需要依赖于保持不变的数字。看到这里:http://www.php.net/manual/en/mysqli-result.fetch-field.php或者我不明白这个问题... –

回答

0

我不知道你想要什么样的最终结果。

虽然元数据表information_schema.columns可以帮助您。这将为您提供每个表的列位置(ordinal_position)和列名称(column_name)的映射。

在php中,您可以按位置访问某列的数据。然后,您可以查找该表中该位置的列名称。 。 。并做它你想要的。

例如,您可以为一组这样的表获取所有可能的列名,并为它们创建一个视图的代码。喜欢的东西:

create view vw_AllQuestions as (
    select <column list> -- with NULL values for the columns not in TableA 
    from tableA 
    union all 
    select <column list> -- with NULL values for the columns not in TableB 
    from tableB 
    . . . 
); 
0

尽管戈登的答案会工作,我能够把它做了一下简单:

$query = 'SELECT * FROM lime_tokens_'.$audit.' AS tokens INNER JOIN lime_survey_'.$audit.' AS audits ON tokens.token = audits.token WHERE tokens.completed != "N"'; 
$result = mysql_query($query) or die(mysql_error()); 

while ($row = mysql_fetch_row($result)) { 
... 
} 

这给了我一个编号的阵列,并且由于结构是所有调查相同该数组总是相同的。

+0

@戈登Linoff - 这个查询会被认为是不好的做法由于SQL注入风险?我需要类似的解决方案。 –

相关问题