Нужна помощь в понимании синтаксиса MySql - PullRequest
0 голосов
/ 21 мая 2019

Я застрял на этой проблеме хакерранка для MySql и продолжаю получать синтаксическую ошибку.Я пытаюсь выбрать города с самыми короткими и длинными именами в алфавитном порядке.

Когда я пытаюсь упорядочить по городам с ограничением 1 для обоих, я получаю сообщение об ошибке.Когда я заказываю только по городу с ограничением 1 после второго запроса, я получаю ответ только на первый запрос.

(select CITY, length(CITY) from STATION order by length(CITY) limit 5) order by city limit 1; 
UNION 
(select CITY, length(CITY) from STATION order by length(CITY) DESC limit 5) order by city limit 1; 

Это ошибка, которую я получаю

ERROR 1064 (42000) at line 1: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'UNION 
(select CITY, length(CITY) from STATION order by length(CITY) DESC limit ' at line 2

Ответы [ 2 ]

2 голосов
/ 21 мая 2019

У вас есть 4 order by с, где нужны только два.

(select CITY, length(CITY)
 from STATION
 order by length(CITY)
 limit 1
) union all
(select CITY, length(CITY)
 from STATION
 order by length(CITY) DESC
 limit 1
);

Неясно, почему вы хотите указать limit 5 в подзапросе, а затем limit 1 за его пределами.

Другая проблема в вашем запросе заключается в том, что после точки с запятойпервый подзапрос, по сути делит составной запрос на два - и union не является допустимым ключевым словом для запуска запроса.

1 голос
/ 21 мая 2019

Завершив свой первый SELECT запрос с помощью ;, вы сделали его совершенно отдельным оператором.

UNION необходимо поместить между двумя простыми запросами, а ваш - нет.

Вы можете сделать это:

(SELECT ...) UNION (SELECT ...);

Но не:

(SELECT ...); UNION (SELECT ...);

По аналогии, представьте, что вы программируете на Java, PHP или другом языке, который завершает оператор точкой с запятой,Следующая попытка и добавление двух чисел будет ошибкой:

i = 123;
  + 456;

Тогда как это будет хорошо:

i = 123 + 456;
...