После авторизации Вы получите доступ к файлам, скрытым материалам сайта, исходным кодам
возможность комментировать и т.д.

Вы можете авторизоваться на сайте всего одним кликом:

2016-07-08
SQL → Псевдонимы для столбцов и таблиц
Псевдоним таблицы

В некоторых ситуациях к столбцам и таблицам MySQL гораздо удобнее обращаться по другим именам. Рассмотрим это действие на примере базы данных для заказа авиабилетов.

Псевдонимы для столбцов и таблиц

Информация о предлагаемых авиакомпанией перелетах представлена в виде двух таблиц — flight и сity. Каждая запись в таблице flight отражает сведения об отдельном авиарейсе: место вылета (столбец origincityid), пункт назначения (столбец destinationcityid), а также дата и время вылета, тип самолета, номер рейса и стоимость билетов (остальные столбцы). В таблице city находится список всех городов, куда совершаются полеты. Таким образом, в столбцах origincityid и destinationcityid таблицы flight будут находиться только идентификаторы, ссылающиеся на записи внутри таблицы city.

Чтобы получить список перелетов с пунктами вылета, необходимо выполнить следующий запрос:

SELECT flight.number, city.name
   FROM flight INNER JOIN city
   ON flight.origincityid = city.id

Запрос для получения списка перелетов с пунктами назначения похож на предыдущий:

SELECT flight.number, city.name
   FROM flight INNER JOIN city
   ON flight.destinationcityid = city.id

Логично предположить, что для вывода рейсов с обоими пунктами — вылета и назначения — нужно осуществить запрос, представленный ниже.

SELECT flight.number, city.name, city.name
   FROM flight INNER JOIN city
      ON flight.origincityid = city.id
   INNER JOIN city
      ON flight.destinationcityid = city.id

Однако, как только вы попытаетесь это сделать, phpMyAdmin выведет ошибку:
#1066 — Not unique table/alias: 'city'.

Почему так происходит? Отбросьте в сторону свои ожидания и попробуйте разобраться в том, что на самом деле означает данный запрос. Он просит MySQL- сервер объединить таблицы flight, city и city. Попытка дважды присоединить одну и ту же таблицу и приводит к выводу сообщения об ошибке.

Кроме того, в запросе чувствуется нехватка логики. Он пытается вывести номер рейса, название города и название города (опять же дважды) для всех по лученных записей, сопоставляя с id таблицы city столбцы origincityid и destinationcityid. Другими словами, id таблицы city и столбцы origincityid и destinationcityid должны быть одинаковыми. Даже если бы запрос сработал, его результатом стал бы список всех рейсов, в котором пункты вылета и пункты назначения совпадают. Вряд ли найдется хоть один рейс, который будет соответствовать такому описанию, если речь идет не об авиакомпании, пред лагающей обзорные полеты над городами.

Нужно придумать другой способ для повторного использования таблицы city, позволяющий MySQL избавиться от путаницы. Вам следует вернуть из таблицы две разные записи для каждого результата: одну для места вылета, а другую для пункта назначения. Значительно упростить ситуацию помогли бы две копии таблицы city (одна по имени origin, а другая — destination). Но зачем заниматься поддержкой двух разных списков с одинаковыми городами? Решить проблему можно, указав для таблицы city два уникальных псевдонима (временных имени) внутри запроса.

Если после имени таблицы во фрагменте запроса SELECT, начинающегося с ключевого слова FROM, написать AS псевдоним, то вы получите временное имя, на которое можно ссылаться в любом другом месте запроса. Обратимся к перво му коду, выдающему номера рейсов и места вылета, и укажем для таблицы city псевдоним origin:

SELECT flight.number, origin.паше
   FROM flight INNER JOIN city AS origin
   ON flight.origincityid = origin.id

Запрос сработает, как и раньше, и его результаты останутся прежними, только теперь вы имеете возможность заменить длинные имена таблиц более короткими. Если бы вы воспользовались псевдонимами f и о вместо flight и origin соответственно, то запись сократилась бы уже существенно.

Вернемся к проблемному запросу. Теперь, дважды сославшись на таблицу city с помощью разных псевдонимов, вы сможете выполнить тройное объединение (в котором две таблицы на самом деле являются одной) и получить желаемый результат:

SELECT flight.number, origin.name, destination.name
   FROM flight INNER JOIN city AS origin
      ON flight.origincityid = origin.id
   INNER JOIN city AS destination
      ON flight.destinationcityid = destination.id

Аналогичным образом определяются псевдонимы для столбцов. В нашем случае это поможет различить столбцы name в итоговой таблице:

SELECT f.number, о.name AS origin, d.name AS destination
   FROM flight AS f INNER JOIN city AS о
      ON f .origincityid = o.id
   INNER JOIN city AS d
      ON f .destinationcityid =,d.id

Используйте данный подход, чтобы добавить его в свой проект. Попробуйте реализовать эту идею самостоятельно.

1488
0
Пожалуйста, авторизируйтесь, чтобы скачать архив с файлами урока