Вложенность SQL выбрать в другой SQL выбрать? - PullRequest
1 голос
/ 09 ноября 2011

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

командный стол- Я бы- название команды

стол игроков- Я бы- team_id- player_name

Скажите в выходном html, что я хочу показать заголовки команд, а под каждой командой соответствующие игроки:

Team 1- Боб- Джон

Команда 2- кен- jason

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

Ответы [ 3 ]

2 голосов
/ 09 ноября 2011

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

SELECT team_name,player_name FROM team INNER JOIN players on team.id=players.team_id

Существует несколько способов обработки результатов в PHP. Вы можете просмотреть результаты и добавить их в массив

array(
    team1 => array(
        bob,
        jon
    ),
    team2 => array( etc

Затем вы можете просмотреть массив и вывести результаты так, как вы хотите. Или вы можете просто зацикливаться непосредственно на результатах db и выводить их, сохраняя название команды и выводя его только при его изменении. Я бы порекомендовал первое решение. Он чище и лучше абстрагируется.

0 голосов
/ 09 ноября 2011

То, что вы делаете, это соединение столбца player_name. Начиная с SQL 2008R2, нет функции агрегирования константных строк - если только вы не пишете с использованием каркаса dot net и не включаете его во всех базах данных, где вы используете эту технику.

способ, который будет работать со всеми поддерживаемыми в настоящее время версиями - 2005 +

создать пользовательскую функцию, которая принимает идентификатор команды и возвращает строку с именами (в любом порядке)

Ваш запрос становится

SELECT team_name, dbo.af_PayerNames(team_ID) Players FROM [Team tabel]

Чтобы связать строку внутри функции

DECLARE @Output VARCHAR(4000)
SET @Output = ''
SELECT @Output = @output + ' - ' + COALESCE(Player_Name, '') FROM Players where TeamId = @ param

Вы можете использовать некоторую причудливую логику, чтобы гарантировать, что разделитель '-' добавляется только когда @Output <> ''

Вы можете расширить свою функцию для сортировки по разным порядкам, передав параметр. Решение очень читабельно - возможно, есть способ сделать это с помощью подзапроса, но подзапросы всегда причиняют мне боль! Функциональный подход не подходит для очень больших таблиц - ваш мозг, вероятно, болит.

Надеюсь, это поможет

0 голосов
/ 09 ноября 2011

у вас есть два варианта: объединение или подзапрос. Каждое объединение всегда можно перевести в подзапрос в другом.

Стандартный способ выполнять меньше запросов:

первый выбор на всем столе команд.

Затем переберите свои результаты, для х в названиях команд: и простой выбор, где team_id = x для каждой команды.

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

...