2013-04-02 2 views
0

Мне нужно работать со столами, созданными limesurvey. Структура таблицы всегда одна и та же, что и первые 9 колонок (id | taken | submitdate | ...). Но остальные 200 столбцов динамически названы, состоящие из id, идентификатора запроса и идентификатора вопроса (то есть 445999X180X151702). Новые таблицы могут быть вставлены, но будут (на данный момент) всегда следовать этой схеме. Я должен создать некоторую форму листать php. Я мог бы ссылаться на столбцы по номеру, но мне это кажется неправильным (изменение числа вопросов маловероятно, но кто знает). Есть ли другой способ? Если нет, могу ли я, по крайней мере, создать какой-то файл сопоставления, чтобы, когда мне нужно внести какие-либо изменения в таблицы, которые легко обновить мое приложение php?выберите из идентичных таблиц mysql с именами динамических столбцов

Спасибо!

EDIT: К сожалению, я не могу контролировать эту структуру таблицы. Так создается таблица 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

@ Gordon Linoff - будет ли этот запрос считаться плохой практикой из-за риска инъекций SQL? Мне нужно подобное решение. –

Смежные вопросы