首页 > 解决方案 > 当有多个城市时,查询显示 max_length_name_city 和 min_length_name_city 按 alfabet 排序

问题描述

为什么我的查询错误?

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;

问题陈述:查询STATION中两个城市的CITY名称最短和最长,以及它们各自的长度(即:名称中的字符数)。如果有多个最小或最大的城市,请选择按字母顺序排列的第一个城市。

样本输入

例如,CITY 有四个条目:

CITY 
----
DEF 
ABC 
PQRS
WXY

样本输出

ABC 3
PQRS 4

说明 按字母顺序排列时,CITY 名称列为 ABC、DEF、PQRS 和 WXY,长度为 和 。最长的名称是 PQRS,但有最短命名城市的选项。选择 ABC,因为它按字母顺序排在第一位。

注意您可以编写两个单独的查询来获得所需的输出。它不必是单个查询。

标签: mysqlsql

解决方案


MIN(city)是词汇量最小的城市。所以给定“Aachen”和“Dover”,它将是“Aachen”。LENGTH(MIN(city))是那个城市的长度,所以是 6,而不是 5 。

要获得最短的城市名称,您需要以下内容:

select min(city), length(city)
from station
group by length(city)
order by length(city)
limit 1;

通过按长度分组,min(city)将找到每个长度的词汇最少的城市名称。

同样,对于最长的名称:

select min(city), length(city)
from station
group by length(city)
order by length(city) desc
limit 1;

(仍然为每个长度选择词汇上的第一个城市名称,但按长度降序而不是升序排序)。

使用窗口函数最容易在单个查询中获取两者(需要 mysql 8.0 或 mariadb 10.2 或更高版本):

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

在早期版本中,这样做最简单:

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

(这可能看起来是一个更简单的查询,但不能在城市上使用索引)。


推荐阅读