2017-10-29 124 views
-2
select *, sum(sales_qty) as total_qty 
from sales_details 
left join sales on sales.salesid=sales_details.salesid 
where month(sales.sales_date)='$m' 
group by productid order by total_qty asc limit 2, 4 

我有那个按升序排序的sql。现在我想要按降序对结果进行排序。我曾尝试使用子查询,但不适合我。任何帮助或建议表示赞赏。从ASC订购到DESC订单的MySQL子查询

这是我已经试过SQL:

select * from (
     select *, sum(sales_qty) as total_qty 
     from sales_details 
     left join sales on sales.salesid=sales_details.salesid 
     where month(sales.sales_date)='$m' 
     group by productid 
     order by total_qty asc 
     limit 2, 4 
    ) as sub 
order by sum(sales_qty) desc 
+0

为什么不用'desc'替换'asc'关键字? – Mureinik

+0

我首先在asc中对它进行排序以获得至少4个total_qty,现在我想按desc顺序对结果进行排序。 –

+0

在您的查询中发现问题需要长距离滚动到右侧,这使得志愿者难以发现。我重新格式化了您的查询以包含换行符。为了便于阅读,格式化SQL查询通常是一个好主意。 –

回答

1

您与子查询的查询应该结束

... ORDER BY sales_qty DESC 

为什么?当您说... ORDER BY SUM(sales_qty) DESC您正在将外部查询转换为聚合查询。由于该外部聚合查询没有GROUP BY子句,因此它必须具有一行结果集。

外部查询将内部查询视为表,虚拟表。该虚拟表具有名为sales_qty的列。这是您想要订购的价值。

专业提示:请勿在汇总查询中使用SELECT *。你滥用臭名昭着的非标准MySQL扩展到GROUP BY,这意味着你的结果集包含不可预知的值。读这个。 https://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html