SQL - ORDER BY 不返回结果

Posted

技术标签:

【中文标题】SQL - ORDER BY 不返回结果【英文标题】:SQL - ORDER BY not returning results 【发布时间】:2017-02-08 14:58:50 【问题描述】:

我正在努力解决这个挑战(不要求最终解决方案)! Problem Link

第一步:我想返回城市列表,length(city) 按长度排序,使用比ROWNUMBER = 1

选择名称最短的城市:

我的代码是:

SELECT DISTINCT city, LENGTH(city) FROM station ORDER BY LENGTH(city) ASC;

我希望结果按 LENGTH 排序,但它是按城市排序的。如果我改为:

SELECT DISTINCT city, LENGTH(city) FROM station ORDER BY city DESC;

仍然是按城市按 ASC 顺序排序。

我做错了什么?或者是页面有问题,因为即使SELECT city FROM station ORDER by city DESC; 也不起作用。

谢谢。

【问题讨论】:

您的第一个查询应该没问题。 (但是,我会做SELECT DISTINCT city, LENGTH(city) as len FROM station ORDER BY len ASC; 在我看来页面有问题。第一个查询没有问题。 我仍然倾向于使用 Gordon 的版本,当使用 DISTINCT 时,每行都会调用 LEN 函数,然后删除重复项,而使用 GROUP BY 时删除重复项首先,然后在其余记录上调用 LEN 函数。对于像LEN 这样开销非常低的东西,并且取决于重复的数量,这是一个相当微不足道的优化,但对于其他功能(特别是用户定义的)或存在大量重复的数据,这可能更重要。 【参考方案1】:

这可能取决于数据库,但似乎distinct 可能会在order by 之后处理。只需使用GROUP BY

SELECT city, LENGTH(city)
FROM station
GROUP BY city
ORDER BY LENGTH(city) ASC;

【讨论】:

我发誓这不是我的反对意见,但这不会在大多数 RDBMS 中运行,因为您按一列分组,而在另一列中没有使用聚合函数......所以我不是真的确定赞成... GROUP BY 时不需要聚合函数。但是, DISTINCT 应​​该在 ORDER BY 之前(逻辑上)进行处理,即使不是 - 也没有关系。原始查询应返回预期结果。 @Lamak 我所知道的大多数 DBMS 都足够聪明地认识到 LEN(City) 在功能上依赖于 City,因此会允许它 @Lamak 。 . .当然,这适用于任何数据库。您可以在 group by 键上运行函数。 GROUP BY 键是cityLENGTH() 只是将其作为参数。 @jarlh 。 . .注意第一句话。 OP 使用的任何数据库似乎都没有遵守该约定(或者它是一个标准)。

以上是关于SQL - ORDER BY 不返回结果的主要内容,如果未能解决你的问题,请参考以下文章

MySQL ORDER BY 根据日期时间查询返回不正确的结果

oracle SQL语句中结合order by子句使用rownum

使用 GROUP BY 和 ORDER BY pl/sql 获取结果集的 N 到 M 行 [重复]

让sql语句不排序,按照in语句的顺序返回结果

SQL-W3School:SQL ORDER BY 子句

php 数据库查询order by 与查询返回的数据类型