Целый час пытался составить нужный запрос, не получалось. Получилось с LEFT JOIN, хотя я так и не понял что именно он делает
valenok
Отправлено: 11 Сентября, 2007 - 18:46:09
Здесь могла бы быть ваша реклама
Покинул форум
Сообщений всего: 4574
Дата рег-ции: Июль 2006 Откуда: Israel
Помог: 3 раз(а)
Конечно респект ARTY за столь хороший сайт,
за то что перевёл с Английского документацию по нескольким функциям,
собрал полезную информацию по php на одном сайте
Но обращаться куда лучше к официальным документациям.
На этот раз стоило обратиться к офф. документации по причине удобного построения самой документации
mysql.ru
В поиске по документации пишем: JOIN
попадаем на http://www[dot]mysql[dot]ru/docs/man/JOIN[dot]html
Читаем, ничего не понимаем, но видим что это подкатегория
6.4.1 Синтаксис оператора SELECT
Что и идём читать
(Там помогает Ctrl+F)
Цитата:
Выражение FROM table_references задает таблицы, из которых надлежит извлекать строки. Если указано имя более чем одной таблицы, следует выполнить объединение. Информацию о синтаксисе объединения можно найти в разделе section 6.4.1.1 Синтаксис оператора JOIN. Для каждой заданной таблицы по желанию можно указать псевдоним.
Цитата:
При указании параметра STRAIGHT_JOIN оптимизатор будет объединять таблицы в том порядке, в котором они перечислены в выражении FROM. Применение данного параметра позволяет увеличить скорость выполнения запроса, если оптимизатор производит объединение таблиц неоптимальным образом.
Что касается JOIN всех сторон света
Цитата:
Операции LEFT JOIN и RIGHT JOIN
Объединяют записи исходных таблиц при использовании в любом предложении FROM.
Цитата:
По возможности минимально используйте LEFT JOIN для объединения таблиц. Это весьма трудоёмкая операция для базы данных.
Пусть, нам надо выбрать заказы всех продавцов с указанием уникального идентификатора продавца, его имени, суммы заказа и даты заказа (т.е. данные мы должны брать из двух таблиц)
(про NATURAL JOIN я не буду рассказывать, дабы не смутить тебя окончательно).
Это внутреннее объединение таблиц. Если мы не будем использовать условие (WHERE, ON, USING), то получим так называемое "декартово произведение" - это когда каждая строка первой таблицы соединяется с каждой строкой второй таблицы.
А теперь - внешние объединения. Они бывают трех видов
* LEFT OUTER JOIN
* RIGHT OUTER JOIN
* FULL OUTER JOIN
Пусть нам нужно получить имена всех клиентов (покупателей), и заказы, которые они сделали. Причем, в результат нужно включить и тех клиентов, которые еще не сделали ни одного заказа (в наше БД их нет, но вообще, они могут быть):
В отличие от внутренних объединений, внешние объединения включают в результат также строки, не имеющие связанных с ними строк.
Про RIGHT OUTER JOIN рассказывать не буду - т.к. это, практически, не отличается от LEFT OUTER JOIN.
Полное внешнее объединение (FULL OUTER JOIN) извлекает все строки из обеих таблиц и связывает между собой те, которые могут быть связаны. В отличие от левого внешнего и правого внешнего объединений, которые включают в результат несвязанные строки только из одной таблицы, полное внешнее объединение включает в результат несвязанные строки из обеих таблиц.
Покинул форум
Сообщений всего: 147
Дата рег-ции: Май 2007
Помог: 0 раз(а)
[+]
Вроде понятно
Что-то захотелось рассказать, зачем мне пригодился JOIN
Вообщем, это я ворочию простой мод портала под phpBB 3
Есть таблица с категориями - поля id, catname и order - для сортировки.
Есть таблица с постами - интересует только поле cat_id.
Мне нужно было получить имя, id и число постов в категории, причём я не хотел составлять лишние запросы
Сначала пробовал с WHERE - почти получилось, но если в категории нет постов, она не была в результатах.
А получилось так (PORTAL_POSTS_TABLE и PORTAL_CATS_TABLE содержат имена таблиц):
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.