2013-03-03 7 views
3

Я пытаюсь выяснить, если есть простой способ для динамической загрузки 2-ой таблицы на основе значения столбца первой таблицы с MySQLДинамическое соединение таблицы на основе другого значения столбца таблицы?

серверов (таблица 1):

ID | Игра | Название

Servers_1 (таблица 2, вариант 1):

server_id (ссылки на servers.id) | game_version | игроки | плагины

Servers_2 (таблица 2, вариант 2):

server_id (ссылки на servers.id) | game_version | игроки | моды | game_map

Servers_etc. (Таблица 2, вариант и т.д.)

Пытаясь выяснить, как сделать что-то вроде

left_join servers_[servers.game] on servers.id = servers_[servers.game].server_id 

Так было бы захватить значение servers.game и использовать, чтобы закончить имя таблицы. Если это не представляется возможным, то это саз возможно, такие как:

Left_Join 
    if (servers.game == 1) 'servers_1' 
    elseif (servers.game == 2) 'servers_2' 
    elseif (servers.game == 3) 'servers_3' 
+0

См. Следующие сведения: http://rpbouman.blogspot.com/2005/11/mysql-5-prepared-statement-syntax-and.html –

ответ

2

Одним из вариантов были бы LEFT JOIN каждыми из таблиц и использовать CASE заявление для возвращения соответствующих данных.

Что-то, как это должно помочь вам начать работу:

SELECT S.Id, S.Game, S.Title, 
    CASE S.Game 
     WHEN 1 THEN S1.game_version 
     WHEN 2 THEN S2.game_version 
    END game_version, 
    ... 
FROM Servers S 
    LEFT JOIN Servers_1 S1 ON S.id = S1.Server_Id AND S.Game = 1 
    LEFT JOIN Servers_2 S2 ON S.id = S2.Server_Id AND S.Game = 2 

Вместо использования CASE, вы, вероятно, просто использовать COALESCE как каждый Id/Game должен быть уникальным и только 1 не будет NULL:

SELECT COALESCE(S1.game_version,S2.game_version,...) game_version 

Если нет одинакового идентификатора сервера в нескольких таблицах, вы можете оставить AND S.Game ... из LEFT JOINs, поскольку он больше не понадобится. Зависит от ваших уникальных клавиш.

В качестве альтернативы вы можете использовать Dynamic SQL.

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