Данная статья призвана уберечь разработчиков от не совсем очевидной ошибки при составлении SQL-запросов с использованием оператора UNION.
Например, у нас есть 2 таблицы с аудиозаписями (таблица audio) и видеозаписями (таблица video).
| id_video | video_title | artist |
| 1 | Du Hast | 1 |
| 2 | Links | 1 |
| id_audio | audio_title | artist |
| 1 | Sonne | 1 |
| 2 | Angel | 1 |
Теперь нам нужно выбрать все произведения одного исполнителя и отсортировать их по названию. Мы будем использовать оператор UNION для объединения двух таблиц.
Вариант первый. В каждом из двух запросов мы будем использовать один алиас для названия и потом будем сортировать записи по этому алиасу.
SELECT `video_title` as `title` FROM `video` WHERE `artist` = 1 UNION SELECT `audio_title` as `title` FROM `audio` WHERE `artist` = 1 ORDER BY `title`
Вот какой результат мы получим:
| title |
| Angel |
| Du Hast |
| Links |
| Sonne |
Ошибкой будет использовать в конструкции ORDER BY название какой-либо из таблиц.
Вариант второй. Если нужно выбрать больше полей, но не хочется все их перечислять, то мы можем использовать следующий запрос.
SELECT * FROM `video` WHERE `artist` = 1 UNION SELECT * FROM `audio` WHERE `artist` = 1 ORDER BY 2
Цифра 2 говорит о том что мы сортируем по второму полю в результирующей таблице.
Получаем:
| id_video | video_title | artist |
| 2 | Angel | 1 |
| 1 | Du Hast | 1 |
| 2 | Links | 1 |
| 1 | Sonne | 1 |