MySQL的:排序聚合以零递增

时间:2019-05-18 17:48:22

标签: mysql

我正在尝试对包含一些零值的聚合列进行排序。我需要零值是最后一个。

对于非聚合列,我可以执行以下操作(简化示例查询):

SELECT age FROM books 
ORDER BY 
age = 0,
age ASC

但是,对于聚合列,由于该列不存在,我遇到了错误:

SELECT avg(age) as avg_age FROM books 
GROUP BY book.type 
ORDER BY 
avg_age = 0,
avg_age ASC

错误是: SQLSTATE[42S22]: Column not found: 1247 Reference 'avg_age' not supported (reference to group function)

我完全感谢为什么发生这种情况,但是找不到任何解决方法,没有任何提示吗?

2 个答案:

答案 0 :(得分:1)

接缝处会有一个(旧的)相关的错误报告

  

[2016年3月21日9:22]JiříKavalík

     

描述:仅使用别名来汇总ORDER BY中的列时   允许使用纯别名,在任何表达式中使用它都会返回错误。

     

http://sqlfiddle.com/#!9/e87bb/7

     

解决方法:   -选择表达式并使用其别名   -使用派生表并排序外部表

     

如何重复:创建表t(a int);   -这些工作按x的顺序从t组中选择sum(a)x;从t组按sum(a)的顺序选择sum(a)x;从t中选择sum(a)x   按-sum(a)的顺序分组;

     

-错误地给出了“不支持参考'x'(参考组功能)”,按-x的顺序从t组中选择sum(a)x;

source

您必须编写,这样做会更好,因为查询然后也是ANSI / ISO SQL标准有效,这意味着查询很可能在大多数数据库供应商软件之间具有更好的可移植性。

SELECT
  avg(books.age) as avg_age
FROM books
GROUP BY books.type
ORDER BY
  avg(books.age) = 0
, avg(books.age) ASC

请参见demo,此错误已在MySQL 8.0中修复,请参见demo

答案 1 :(得分:0)

尝试重复代码

SELECT avg(age) as avg_age 
FROM books 
GROUP BY book.type 
ORDER BY avg(age) = 0, avg(age) ASC