Как УПОРЯДОЧИТЬ с помощью ОБЪЕДИНЕНИЯ в SQL с ПСЕВДОНИМАМИ столбцов?

#mysql #sql #sql-order-by #union #alias

#mysql #sql #sql-order-by #объединение #псевдоним

Вопрос:

Вот мой очень простой запрос MYSQL :

 (SELECT start, name, id, info FROM `table1`)
UNION
(SELECT end, name, id, info FROM `table1`)
 

Я хочу отсортировать результат по 1-му столбцу, и я догадался, что мне нужно использовать псевдонимы:

 (SELECT start as mydate, name, id, info FROM `table1`)
UNION
(SELECT end as mydate, name, id, info FROM `table1`)
ORDER BY mydate
 

Я был удивлен, что MYSQL выдал эту ошибку :

  "Unknown column 'mydate' in 'where clause'" 
 

Я закончил с этой рабочей плохой практикой :

 (SELECT start, name, id, info FROM table1)
UNION
(SELECT end, name, id, info FROM table1)
ORDER BY 1
 

источник: https://www.mysqltutorial.org/sql-union-mysql.aspx

Но я хотел бы понять свою ошибку!

Комментарии:

1. Я не могу воспроизвести эту ошибку в db-fiddle . Является ли то, что вы опубликовали, точным SQL, который вы используете? Кажется странным, что ваше сообщение об ошибке ссылается на предложение where, когда вы его не указали.

2. Является ли ваш запрос частью другого, более крупного запроса?

3. Я также не могу воспроизвести ошибку. Ни в MySQL 5.5, 5.6, 5.7, ни в MySQL 8. Круглые скобки не нужны. Тем не менее, со скобками или без, запрос должен выполняться нормально. Какую версию MySQL вы используете?

4. Я согласен с другими комментариями, он работает с разными версиями, и «ORDER BY mydate» не выдает никаких ошибок, также попробуйте удалить круглые скобки. пожалуйста, укажите вашу версию

Ответ №1:

Используйте вложенный запрос.

 SELECT q.* 
  FROM (
              SELECT start as mydate, name, id, info FROM `table1`
              UNION ALL
              SELECT end as mydate, name, id, info FROM `table1`
       ) AS q
 ORDER BY q.mydate
 

Внутренний запрос создает ваш результирующий набор, а внешний упорядочивает его. Планировщик запросов MySQL достаточно умен в оптимизации такого рода вещей.

Кстати UNION , удаляет дубликаты и UNION ALL не делает.

Комментарии:

1. Нет необходимости вкладывать его. OP уже утверждает ORDER BY 1 , что работает.

2. Ну, хорошо. Я придерживаюсь своего ответа, потому что он указывает на общее решение проблемы манипулирования результирующими наборами операций ОБЪЕДИНЕНИЯ.