Псевдоніми для стовпців і таблиць (sql - урок з курсу)

Псевдоніми для стовпців і таблиць (sql - урок з курсу)

У деяких ситуаціях до стовпців і таблиць MySQL набагато зручніше звертатися по іншим іменам. Розглянемо це дія на прикладі бази даних для замовлення авіаквитків.

Інформація про пропонованих авіакомпанією перельотах представлена ​​у вигляді двох таблиць - flight і Сity. Кожен запис в таблиці flight відображає відомості про окремий авіарейс: місце вильоту (стовпець origincityid), пункт призначення (стовпець destinationcityid), а також дата і час вильоту, тип літака, номер рейсу і вартість квитків (інші стовпці). У таблиці city знаходиться список всіх міст, куди здійснюються польоти. Таким чином, в шпальтах origincityid і destinationcityid таблиці flight будуть знаходитися тільки ідентифікатори, що посилаються на записи всередині таблиці city.

Щоб отримати список перельотів з пунктами вильоту, необхідно виконати наступний запит:

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

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

Однак, як тільки ви спробуєте це зробити, 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:

Запит спрацює, як і раніше, і його результати залишаться колишніми, тільки тепер ви маєте можливість замінити довгі імена таблиць більш короткими. Якби ви скористалися псевдонімами f і про замість flight і origin відповідно, то запис скоротилася б уже суттєво.

Повернемося до проблемного запитом. Тепер, двічі пославшись на таблицю city за допомогою різних псевдонімів, ви зможете виконати потрійне об'єднання (в якому дві таблиці насправді є однією) і отримати бажаний результат:

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

Використовуйте цей підхід, щоб додати його в свій проект. Спробуйте реалізувати цю ідею самостійно.