Кроме полных, внутренних и внешних объединений, MySQL поддерживает еще и четвертый тип объединения, а именно - самообъединение. Этот тип объединения предполагает объединение таблицы с самой собой и предназначен для выборки данных из таблицы, записи которой содержат внутренние связи между собой. Рассмотрим следующую таблицу.
Самообъединения
Различные ударения
Определить принадлежность пользователей к определенным группам можно с помощью объединения. Для можно этого следует воспользоваться функцией GROUP_CONCAT(), появившейся в MySQL 4.1. Рассмотрим следующий пример:
mysql> SELECT g.name, GROUP_CONCAT(u.name SEPARATOR ',') FROM users AS u groups AS g, users_groups AS ug WHERE ug.gid = g.gid AND ug.uid = u.uid GROUP BY ug.gid;
Самообъединения
Это простая структура меню, каждая запись которого идентифицирует уникальный узел в дереве. Каждая запись имеет уникальный идентификатор, а также содержит идентификатор порождающего его элемента меню. Эти два идентификатора используются для определения взаимосвязи "предок-потомок" в дереве меню. Иерархия предыдущих данных представлена на рис. 10.1. А теперь предположим, что необходимо отобразить список всех узлов дерева с именами их предков, т.е. результирующий набор наподобие представленного в следующем листинге.
Самообъединения
Правда, получить подобный результирующий набор не так уж и просто. Т.к. все данные находятся в одной таблице, простой запрос SELECT может и не сработать. Не поможет и сложное внешнее объединение. Наиболее приемлемым вариантом является только самообъединение, которое позволяет создать вторую, виртуальную, копию таблицы, после чего для получения необходимого результата следует использовать обычное внутреннее объединение между двумя копиями одной таблицы.
Самообъединения
Этот прием связан с использованием псевдонимов. В этом примере создано две копии таблицы menu, которым присвоены псевдонимы a и b соответственно. В результате получим следующие две виртуальные таблицы.
Самообъединения
Самообъединения
Создав эти таблицы, очень нелегко получить их объединение. Для этого используем идентификатор узла в качестве общего столбца - и получим порожденные и порождающие элементы меню в нужном формате.

Объединения типа union

Начиная с версии 4.0, MySQL поддерживает работу оператора UNION, предназначенного для формирования последовательности запросов SELECT в один результирующий набор. Чаще всего этот оператор используется для сложения результирующих наборов, созданных запросами к различным таблицам, и создания единой результирующей таблицы.
Проиллюстрируйте это на примере списка фондовых индексов на фондовых биржах A и B:
Самообъединения
Самообъединения
Синтаксис SQL позволяет объединять столько операторов SELECT, сколько требуется, однако при этом необходимо помнить о двух основных условиях. Во-первых, количество полей, возвращаемых операторами SELECT, должно совпадать. Во-вторых, должны совпадать типы данных возвращаемых полей.
Оператор UNION автоматически убирает повторные строки в составном результирующем наборе (это аналогично поведению обычного оператора SELECT с ключевым словом DISTINCT) и четко видно в предыдущем примере. Результирующий набор содержит только по одной записи с биржевыми индексами HTYF и TGDB, которые встречаются на обеих биржах. При необходимости увидеть в операторе UNION все записи, для отключения автоматической фильтрации повторяющихся записей, в оператор UNION добавляется ключевое слово ALL.
Самообъединения
Здравый смысл
Добавление предложения ORDER BY в оператор SELECT, входящий в состав оператора UNION, не имеет особого смысла, т.к. результирующий набор, сгенерированный каждым оператором в отдельности, для пользователя невидим, он видит только общий окончательный результирующий набор.

Наконец, можно отсортировать результирующий набор, возвращенный оператором UNION, путем добавления предложения ORDER BY в конец запроса. Но каждый отдельный запрос SELECT необходимо заключить при этом в скобки, чтобы MySQL "знал", что предложение ORDER BY относится ко всему окончательному результирующему набору, а не к последнему оператору SELECT оператора UNION. Следующий пример демонстрирует сортировку биржевых индексов в порядке, обратном алфавитному.
Самообъединения
Резюме
Эта глава посвящается одному из самых мощных инструментов обработки данных - объединениям - и сопровождается примерами их использования для создания мощных и сложных запросов.
Объединение позволяет объединять две и более таблицы с использованием общих полей между ними, а затем выполнить запросы SELECT по полученному результату. MySQL поддерживает множество различных типов объединений:
■ полные объединения, которые подразумевают умножение количества записей таблиц для создания общей таблицы, содержащей все возможные комбинации;
■ внутренние объединения, - объединяются только соответствующие записи таблиц, занятых в объединении;
■ внешние объединения, - объединяются все записи одной из занятых в объединении таблиц, заполняя несоответствующие записи другой значениями NULL;
■ самообъединения, - таблицы объединяются с ними самими с помощью псевдонимов, после чего объединяются полученные копии с применением механизма внешнего объединения;
■ объединение UNION предусматривает сложение записей различных таблиц для создания одного результирующего набора.