А также, как делать вывод из запроса (нескольких таблиц)... как я понимаю, делается также, как и при обычном запросе... да?
Спустя 55 минут, 53 секунды (9.02.2009 - 19:55) LoneCat написал(а):
Итак, есть две таблицы, первая (categories)
Итак, у нас задача, нам нужно выбрать все названия наименований, вместе с названиями их категорий, за одну выборку.
Объединение таблиц в MySQL производится засчет команд INNER JOIN и LEFT JOIN, в виде:
- id - первичный ключ, integer
- name - название, varchar
- 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 \ Третье наименование \ Третья категория
Так как категории, указанной у второго наименования в таблице категорий нет.
продолжение следует...
Спустя 12 минут, 11 секунд (9.02.2009 - 20:07) LoneCat написал(а):
Ну и в случае когда условию соотвествуют несколько рядов таблицы, с которой происходит объединение, то:
Таблица категорий:
1 \ Первая категория
3 \ Третья категория
3 \ Четвертая категория
То запрос:
Таблица категорий:
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 \ Третье наименование \ Четвертая категория
Тоесть так как условию совпадает несколько рядов - он продублирует левую часть по кол-ву совпадений в правой части.