Как обновить заголовки таблицы с другой таблицы, соответствующие строкам? - PullRequest
1 голос
/ 12 октября 2019

Я хотел бы создать процедуру MYSQL, которая динамически переименовывает заголовки в TABLE01 с соответствующим содержанием TABLE02 -> ожидаемые результаты отображаются на TABLE03 .

Вот содержание таблиц:

    TABLE01 (EXAMPLE, THE HEADERS MIGHT CHANGE BUT THEY ARE ALWAYS INCLUDED IN TABLE02):

            id1 | BOOK | AUTHOR | YEAR |
            1|Les Miserables|Hugo|1862|
            2|Notre Dame|Hugo|1831|
            |...|...|...|

    TABLE02 (STATIC TABLE THAT STAYS UNCHANGED):

            id2 | INPUT | OUTPUT | LANGUAGE |
            1|BOOK|livre |FR|
            2|AUTHOR|auteur|FR|
            3|YEAR|annee|FR|
            4|...|...|SP|
            5|...|...|SP|

Процедура должна запросить параметр (здесь 'FR'), затем сгенерировать TABLE 03 с соответствующимсодержимое из таблицы 02, но с обновленными заголовками столбцов.

         TABLE03 :
            id | livre | auteur | annee |
            1|Les Miserables|Hugo|1862|
            2|Notre Dame|Hugo|1831|  
            |...|...|...|

Простое ОБНОВЛЕНИЕ может работать, но я хотел бы обобщить для различных таблиц с различными столбцами.

Спасибо за вашу помощь!

РЕДАКТИРОВАТЬ 1 : у меня перефразируется вопрос: Динамическое обновление заголовков таблицы с помощью MYSQL

1 Ответ

1 голос
/ 13 октября 2019

Отказ от ответственности: это решение не проверено

Я думаю, что вам нужно использовать динамический SQL, который создаст ваш оператор SELECT и создаст псевдоним AS на лету (AS псевдоним определяет имя заголовка столбца)

Во-первых, вам нужно несколько справочных таблиц (предполагается, что столбцы вашей базы данных всегда на английском языке и будут рассматриваться в качестве необходимого для другого языка) *

Язык

id| LanguageName
1 | English
2 | Francais
3 | Espanola

Атрибут

id|BaseName | Translation |LanguageId
1 |Book     | Livre       |2
2 |Book     | Libro       |3
3 |Author   | Auteur      |2
4 |Author   | Autora      |3
5 |Year     | Annee       |2
6 |Year     | Ano         |3

Тогда кости вашей хранимой процедуры будут выглядеть примерно так:

SET @language:='French'; # this will be a parameter in your stored procedure

SET @LangId = (SELECT id FROM Language WHERE LanguageName = @language) 

# Get the translation for the columns in your query
SET @BookTranslation:=(SELECT Translation FROM Attribute WHERE BaseName = 'Book' AND LanguageId = @LangId)
SET @AuthorTranslation:=(SELECT Translation FROM Attribute WHERE BaseName = 'Author' AND LanguageId = @LangId)
SET @YearTranslation:=(SELECT Translation FROM Attribute WHERE BaseName = 'Year' AND LanguageId = @LangId)


# build the statement
SET @sql:='SELECT '
SET @sql:=CONCAT(@sql,'Book AS `')
SET @sql:=CONCAT(@sql,@BookTranslation)
SET @sql:=CONCAT(@sql,'`,')
SET @sql:=CONCAT(@sql,'Author AS `')
SET @sql:=CONCAT(@sql,@AuthorTranslation)
SET @sql:=CONCAT(@sql,'`,')
SET @sql:=CONCAT(@sql,'Year AS `')
SET @sql:=CONCAT(@sql,@YearTranslation)
SET @sql:=CONCAT(@sql,'` ')

SET @sql:=CONCAT(@sql,'FROM TABLE01'

# Execute the statement
PREPARE dynamic_statement FROM @sql;
EXECUTE dynamic_statement;
DEALLOCATE PREPARE dynamic_statement;

* Вы также можете рассмотреть возможность переименования столбцов в TABLE01 вATTR1, ATTR2, ATTR3 и определите английское имя атрибута в таблице Attirbute, однако это может сделать вашу базу данных довольно сложной для работы с

...