MySQL: как получить информацию из нескольких таблиц на основе информации из других таблиц? - PullRequest
0 голосов
/ 09 января 2011

Хорошо, у меня есть 5 таблиц, из которых мне нужно извлечь информацию из одной переменной.

gameinfo
id | name | platforminfoid

gamerinfo
id | name | contact | tag

platforminfo
id | name | abbreviation

rosterinfo
id | name | gameinfoid

rosters
id | gamerinfoid | rosterinfoid

Переменная 1 будет gamerinfo.id, которая будет затем извлекать все релевантные данные из gamerinfo, которая будет извлекать все релевантные данные из реестров, которые будут извлекать все релевантные данные из rosterinfo, которые будут извлекать все соответствующие данные из gameinfo, затем извлечет все соответствующие данные из platforminfo.

В основном это ломается так:

  • gamerinfo содержит основные геймеры информация.
  • rosterinfo содержит основную информацию о реестрах (т.е. название и игра в реестре направлен в сторону)
  • Реестр содержит актуальную ссылку от игрока на разные списки (геймеры могут быть на несколько списков)
  • gameinfo содержит основную информацию об играх (т.е. имя и платформа)
  • Информация о платформе содержит информацию о разные платформы игры играл на (возможно для игры играть на нескольких платформах)

Я довольно новичок в SQL-запросах, включающих JOIN и UNION, и тому подобное, обычно я просто разбиваю их на несколько запросов, но я подумал, что должен быть лучший способ, поэтому, осмотрев сеть, я не смог найти (или, может быть, я просто не мог понять, на что я смотрел) что я искал. Если кто-нибудь может указать мне правильное направление, я был бы очень признателен.

Ответы [ 2 ]

3 голосов
/ 09 января 2011

Нет ничего плохого в пошаговом запросе необходимых данных. Если вы используете JOIN в SQL более 5 таблиц, у нас обязательно будут полезные индексы для всех важных столбцов. Кроме того, это может создать много дублирующих данных:

Представьте себе: вам нужна 1 запись из gamerinfo, возможно, 3 из gameinfo, 4 из списка участников и оба из трех оставшихся таблиц. Это даст вам результат 1 * 3 * 4 * 3 * 3 = 108 записей, который будет выглядеть следующим образом:

ID    Col2    Col3
1     1       1
1     1       2
1     1       3
1     2       1
...   ...     ...

Вы можете видеть, что вы получите идентификатор 108 раз, даже если он вам нужен только один раз. Поэтому я советую придерживаться, в основном, единичных, простых запросов для получения необходимых данных.

1 голос
/ 09 января 2011

UNION не требуется, просто несколько JOIN'ов должны выполнить работу

SELECT gameinfo.id AS g_id, gameinfo.name AS g_name, platforminfoid.name AS p_name, platforminfoid.abbreviation AS p_abb, rosterinfo.name AS r_name
FROM gameinfo
LEFT JOIN platforminfo ON gameinfo.platforminfoid = platforminfo.id
LEFT JOIN rosters ON rosters.gameinfoid = gameinfo.id
LEFT JOIN rosterinfo ON rosterinfo.id = rosters.rosterinfoid

WHERE gameinfo.id = XXXX

это должно получить всю информацию об игре на основе идентификатора игры индексирование по всем идентификаторам (gameinfoid, platformid, rosterinfoid) поможет повысить производительность

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