Кроме полных, внутренних и внешних объединений, 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 предусматривает сложение записей различных таблиц для создания одного результирующего набора.
ТОП-10 популярных
Для работы с вещественными числами в MySQL предусмотрено три типа данных - это типы FLOAT, DOUBLE, DECIMAL. Числовой тип FLOAT...
БОЛЬШЕ БОЛЬШИХ LCD-мониторов
Процесс вытеснения с рынка мониторов с электронно-лучевой трубкой (CRT) продолжается. О смещении акцентов в пользу LCD-мониторов теперь заявляют даже те...
Процесс вытеснения с рынка мониторов с электронно-лучевой трубкой (CRT) продолжается. О смещении акцентов в пользу LCD-мониторов теперь заявляют даже те...
Больше больших LCD-мониторов
Процесс вытеснения с рынка мониторов с электронно-лучевой трубкой (CRT) продолжается. О смещении акцентов в пользу LCD-мониторов теперь заявляют даже те...
Процесс вытеснения с рынка мониторов с электронно-лучевой трубкой (CRT) продолжается. О смещении акцентов в пользу LCD-мониторов теперь заявляют даже те...
НОУТБУК с блестящим экраном
Eсли выпустившая ноутбук фирма предлагает его в качестве «замены настольному ПК», то это должно подразумевать под собой нечто большее, чем...
Eсли выпустившая ноутбук фирма предлагает его в качестве «замены настольному ПК», то это должно подразумевать под собой нечто большее, чем...
Иди и пиши. TravelMate C100
Планшетный компьютер платформы Tablet PC обязан в первую очередь быть легким, способным достаточно долго работать без подзарядки батарей. Эти требования...
Планшетный компьютер платформы Tablet PC обязан в первую очередь быть легким, способным достаточно долго работать без подзарядки батарей. Эти требования...
Магнито-оптический дисковод DynaMO
Cейчас, когда традиционные флоппи-дисководы на долгие годы замерли в своем развитии, поиск альтернативных носителей продолжается, и ситуация, казалось бы, разрешилась...
Cейчас, когда традиционные флоппи-дисководы на долгие годы замерли в своем развитии, поиск альтернативных носителей продолжается, и ситуация, казалось бы, разрешилась...
Компьютер для гурманов.«Эксимер ДМ»
Российская компания «Эксимер ДМ», известная как производитель настольных компьютеров, рабочих станций, серверов и ноутбуков, выступила техническим спонсором проведения торжеств, посвященных...
Российская компания «Эксимер ДМ», известная как производитель настольных компьютеров, рабочих станций, серверов и ноутбуков, выступила техническим спонсором проведения торжеств, посвященных...
Для длинных строк, т.е. строк длиннее 255 символов, в MySQL предусмотрены типы BLOB (Binary Large Object, большой двоичный объект) и...
В дополнение к календарным типам, предназначенным для хранения даты и времени отдельно, MySQL также поддерживает гибридные типы данных DATETIME и...
Вообще, к изменению настроек сервера прибегают очень редко. В MySQL программа заранее настроена так, чтобы соответствовать самым распространенным и основным...
Все о MySQL. Самообъединения
28-12-2009
<< Предыдущая статья | Следующая статья >> |
Все о MySQL. Левое внешнее объединение | Все о MySQL. Подзапросы |