[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: связи таблиц и вывод
volnet35
Никак не могу понять работу связей таблиц.... зачем они и как они работают, особенно когда говорят про условие "WHERE"? Какие поля указывать для связи и почему? Помогите разобраться.
А также, как делать вывод из запроса (нескольких таблиц)... как я понимаю, делается также, как и при обычном запросе... да?



Спустя 55 минут, 53 секунды (9.02.2009 - 19:55) LoneCat написал(а):
Итак, есть две таблицы, первая (categories)
  • id - первичный ключ, integer
  • name - название, varchar
и вторая (items)
  • id - первичный ключ, integer
  • category_id - внешний ключ, в котором указывается id категории, integer
  • name - название, varchar
В первой указаны категории наименований, во второй собственно сами наименования, вместо того чтобы во второй писать название категории - пишется ее идентификатор (его называют внешний ключ) для таблицы категорий.

Итак, у нас задача, нам нужно выбрать все названия наименований, вместе с названиями их категорий, за одну выборку.
Объединение таблиц в MySQL производится засчет команд INNER JOIN и LEFT JOIN, в виде:
SQL
SELECT столбцы FROM начальная_таблица [LEFT][INNER] JOIN таблица_с_которой_происходит_объединение ON условие_объединения WHERE условие_выборки

INNER JOIN - жесткое объединение один к одному, если начальная таблица содержит 10 рядов - то больше 10 рядов в любом случае выбрано не будет, также если условие объединение не будет выполнено - ряд выбран не будет, тоесть в таблице с которой происходит объединение условию должен соот-вать один единственный ряд.
LEFT JOIN - нежесткое объединение один ко многим, он выберет все ряды, удволетворяющие условию, если связь будет не один к одному, а один ко многим, и все равно выберет ряд, если условие объединения не совпадет.

Примеры:
Таблица категорий:
id \ name
1 \ Первая категория
3 \ Третья категория

Таблица наименований:
id \ name \ category_id
1 \ Первое наименование \ 1
2 \ Второе наименование \ 2
3 \ Третье наименование \ 3

Итак, выборка
SQL
SELECT items.id, items.name, categories.name FROM items INNER JOIN categories ON items.category_id = categories.id

вернет такой результат:

1 \ Первое наименование \ Первая категория
3 \ Третье наименование \ Третья категория

А выборка
SQL
SELECT items.id, items.name, categories.name FROM items LEFT JOIN categories ON items.category_id = categories.id

вернет:

1 \ Первое наименование \ Первая категория
2 \ Второй наименование \ NULL
3 \ Третье наименование \ Третья категория

Так как категории, указанной у второго наименования в таблице категорий нет.

продолжение следует... smile.gif

Спустя 12 минут, 11 секунд (9.02.2009 - 20:07) LoneCat написал(а):
Ну и в случае когда условию соотвествуют несколько рядов таблицы, с которой происходит объединение, то:

Таблица категорий:
1 \ Первая категория
3 \ Третья категория
3 \ Четвертая категория

То запрос:
SQL
SELECT items.id, items.name, categories.name FROM items INNER JOIN categories ON items.category_id = categories.id

выведет все также, а запрос:
SQL
SELECT items.id, items.name, categories.name FROM items LEFT JOIN categories ON items.category_id = categories.id

выведет:

1 \ Первое наименование \ Первая категория
2 \ Второе наименование \ NULL
3 \ Третье наименование \ Третья категория
3 \ Третье наименование \ Четвертая категория

Тоесть так как условию совпадает несколько рядов - он продублирует левую часть по кол-ву совпадений в правой части.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.