Запрос для отображения порядка max_length_name_city и min_length_name_city в alfabet при наличии более чем одного города

#mysql #sql

#mysql #sql

Вопрос:

Почему мой запрос неверен?

 SELECT MIN(city), LENGTH(MIN(city))
FROM station 
ORDER BY MIN(city) ASC 
LIMIT 1;

SELECT MAX(city), LENGTH(MAX(city)) 
FROM station 
ORDER BY MAX(city) ASC  
LIMIT 1;
  

Формулировка вопроса:
Запросите два города на СТАНЦИИ с самыми короткими и самыми длинными названиями ГОРОДОВ, а также их соответствующую длину (т. Е. количество символов в названии). Если существует более одного самого маленького или самого большого города, выберите тот, который идет первым при заказе в алфавитном порядке.

Пример ввода

Например, CITY содержит четыре записи:

 CITY 
----
DEF 
ABC 
PQRS
WXY
  

Пример вывода

 ABC 3
PQRS 4
  

Объяснение
При упорядочении в алфавитном порядке названия ГОРОДОВ перечислены как ABC, DEF, PQRS и WXY с длинами и . Самое длинное имя — PQRS, но есть варианты для города с самым коротким именем. Выберите ABC, потому что он идет первым в алфавитном порядке.

Обратите внимание, что вы можете написать два отдельных запроса, чтобы получить желаемый результат. Это не обязательно должен быть один запрос.

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

1. какая версия mysql?

2. @forpas откатил вашу правку, потому что вы изменили пример вывода с возможно наличия 1 строки на наличие 2 строк

3. Ни одного конкретного. Это упражнение на хакерство.

4. @forpas неважно, по-видимому, вы были правы: hackerrank.com/challen&es/weather-observation-station-5/problem

Ответ №1:

MIN(city) является лексически минимальным городом. Таким образом, учитывая «Ахен» и «Дувр», это будет «Ахен». И LENGTH(MIN(city)) — длина этого города, поэтому 6, а не 5.

Чтобы получить самое короткое название города, вам нужно что-то вроде:

 select min(city), len&th(city)
from station
&roup by len&th(city)
order by len&th(city)
limit 1;
  

Путем группировки по длине min(city) будет найдено лексически наименьшее название города для каждой длины.

Аналогично, для самого длинного имени:

 select min(city), len&th(city)
from station
&roup by len&th(city)
order by len&th(city) desc
limit 1;
  

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

Получить оба в одном запросе проще всего с помощью оконных функций (требуется mysql 8.0 или mariadb 10.2 или выше):

 select
    first_value(city) over minlen,
    first_value(len&th(city)) over minlen,
    first_value(city) over maxlen,
    first_value(len&th(city)) over maxlen
from station
window
    minlen as (order by len&th(city),city),
    maxlen as (order by len&th(city) desc,city)
limit 1;
  

В более ранних версиях проще всего сделать это следующим образом:

 select
    substr(min(concat(lpad(len&th(city),8,0),city)),9),
    min(len&th(city)),
    substr(min(concat(99999999-len&th(city),city)),9),
    max(len&th(city))
from station;
  

(который может показаться более простым запросом, но не сможет использовать индекс для города).

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

1. Спасибо, спасибо. Полный ответ сработал (с MAX (city) и другим с помощью DESC) сработал.

2. Какой полный ответ? Ответ не должен включать max(city) , это было бы неправильно

3.Представленный код, который сработал, был: SELECT MIN(city), LENGTH(city) FROM station GROUP BY LENGTH(city) ORDER BY LENGTH(city) LIMIT 1; SELECT MAX(city), LENGTH(city) FROM station GROUP BY LENGTH(city) ORDER BY LENGTH(city) DESC LIMIT 1;

4. потому что они запрашивают имя минимальной и максимальной длины.

5. это неверно; это вернет самое длинное название города, которое идет последним в алфавитном порядке, а не то, которое идет первым. вы хотите MIN как для самых длинных, так и для самых коротких запросов