MySQL SELECT и возвращает неизвестное количество связанных внешних ключей - PullRequest
0 голосов
/ 27 марта 2011

У меня есть две таблицы в базе данных, которые выглядят так:

Курс:

  • ixCourse (первичный ключ)
  • enType (enum: 3 возможных значения)
  • sCourse (строка)
  • sTitle (строка)
  • с Когда (строка)
  • sDescription (строка)

Пункт:

  • ixItem (первичный ключ)
  • ixCourse (ссылки на внешние ключи Course.ixCourse)
  • bLink (булево)
  • sAddress (строка)
  • sDescription (строка)

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

Ответы [ 3 ]

1 голос
/ 27 марта 2011

without returning redundant information?Если вы имеете в виду, не повторяя детали курса, то нет - не просто в одном запросе. Есть несколько ужасных запросов (с точки зрения как идеи, так и кода) , чтобы вернуть следующее: , но я бы не советовал исследовать его.

ixCourse, enType .. , ixItem, sDescription
1         1           1       first for course 1
                      2       Second for course 1   << notice no course details
2         1           3       first for course #2

Но обычная практика - это СОЕДИНЯТЬСЯ между двумя, производя

ixCourse, enType .. , ixItem, sDescription
1         1           1       first for course 1
1         1           2       Second for course 1   << course details repeated per item
2         1           3       first for course #2

Запрос на такой запрос будет

select c.*, i.*
from course c
left join item i on c.ixCourse = i.ixCourse

Здесь я использовал LEFT JOIN, который мог бы это произвести (например,2 не имеет элементов)

ixCourse, enType .. , ixItem, sDescription
1         1           1       first for course 1
1                     2       Second for course 1   << course details repeated
2         1           NULL    NULL                  << nothing for item columns
3         1           4       first for course #3

Изменение его на INNER JOIN (или сокращение JOIN) удалит курсы, которые не имеют описания.

0 голосов
/ 27 марта 2011

Непонятно, что вы хотите выводить, но это:

   SELECT c.*, i.*
     FROM COURSE c
LEFT JOIN ITEM i ON i.ixcourse = c.ixcourse

... вернет все курсы и все предметы, связанные с курсом. Если у курса нет элементов, связанных с ним, столбцы ITEM в выходных данных будут иметь значение NULL. Тем не менее, столбцы курса будут содержать повторяющиеся значения, если с ним связано более одного элемента, но столбцы ITEM будут другими.

Если вам нужен только список курсов, в которых есть предметы, используйте:

SELECT c.*, i.*
  FROM COURSE c
  JOIN ITEM i ON i.ixcourse = c.ixcourse

Что такое JOIN?

Это хороший учебник по JOIN и различия между ними .

0 голосов
/ 27 марта 2011

Просто используйте соединение:

SELECT * FROM Course C
JOIN Item I ON C.ixCourse=I.ixCourse

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

...