MYSQL объединяет таблицу, имя которой хранится в виде значения поля в другой таблице - PullRequest
10 голосов
/ 22 мая 2009

Я пытаюсь построить динамический запрос в MYSQL, чтобы присоединиться к таблице, имя которой хранится в виде значения поля в другой таблице, например:

SELECT * FROM CATEGORIES 
INNER JOIN CATEGORISATIONS ON CATEGORISATIONS.id = CATEGORIES.fk_categorisation
INNER JOIN [CATEGORISATIONS.nom_table] LV_REGIONS ON LV_REGIONS.id = CATEGORIES.valeur

Любой ответ?!

Ответы [ 5 ]

9 голосов
/ 23 мая 2009

Вы должны построить динамический SQL http://dev.mysql.com/doc/refman/5.1/en/sql-syntax-prepared-statements.html

как:

select CATEGORISATIONS.nom_table into @tmp FROM ...;
PREPARE stmt1 FROM "SELECT * FROM ... INNER JOIN @tmp ..."; 
EXECUTE stmt1;
DEALLOCATE PREPARE stmt1;
2 голосов
/ 22 мая 2009

Моя первая рекомендация - найти того, кто разработал эту схему, и дать им хорошую книгу по проектированию реляционных баз данных.

Оттуда вы можете двигаться в одном из двух направлений: во-первых, отменить беспорядок, который есть в схеме, загрузив отдельные таблицы с именем CATEGORIZATIONS.nom_table в одну таблицу REGIONS, к которой вы можете обращаться напрямую.

В качестве альтернативы вам нужно разбить этот запрос на несколько частей, используя результат первого INNER JOIN для создания запроса UNION для выполнения второго INNER JOIN.

1 голос
/ 23 мая 2009

Я пытался использовать значения таблиц mysql, возвращенные из подзапроса, в качестве имен полей ранее и не увенчался успехом. Я никогда не мог заставить MySQL принять значение набора записей в качестве имени поля. К сожалению, для выполнения этой задачи мне пришлось использовать php.

1 голос
/ 22 мая 2009

Может быть, парень, который сделал это, знал, что это действительно не очень хорошая практика дизайна ... но иногда вам приходится делать дерьмовый хак, чтобы делать то, что вы хотите сделать ...

Из того, что я знаю о предмете, я не думаю, что вы можете достичь этого только с помощью запроса SELECT.

Может быть, с сохраненным процессом ...

1 голос
/ 22 мая 2009

Я собираюсь предположить, что вы пытаетесь заставить "[CATEGORISATIONS.nom_table]" разрешить имя таблицы.

В этом случае вы можете попытаться использовать там подзапрос, который разрешит только одно имя таблицы (таким образом, набор результатов с 1 строкой и 1 столбцом). Я не уверен, что MySQL примет имя строки для таблицы, но стоит попробовать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...