您可以在单个mySQL查询中包含总计和详细信息行吗?

时间:2017-10-23 20:28:11

标签: mysql

档案中的所有问题似乎与我的确切问题无关。

是否可以根据您在单个查询中拥有的订单的明细行数对明细行进行排序?

考虑以下简化表:

Order number Article number
------------ --------------
123           1
123           2
123           3
234           1
234           2
345           1
456           1
456           2
456           3
456           4
456           5

每个订单的明细行数

Order number Number of lines
------------ ---------------
123           3
234           2
345           1
456           5

是否可以按每个明细行的详细行总数按降序选择订单号,商品编号?换句话说,期望的结果是

Order number Article number
------------ --------------
456          1
456          2
456          3
456          4
456          5
123          1
123          2
123          3
234          1
234          2
345          1

我可以使用多个查询和临时表或额外列来完成。简单的SELECTS,SELF JOIN和UNION似乎都没有给我我想要的结果。是否可以使用单个查询?

3 个答案:

答案 0 :(得分:3)

此查询应该正常工作,因为它从连接中获取计数,然后按计数对其进行排序。

select t1.orderNumber,  t1.articleNumber from myTable t1
inner join
(
  select orderNumber,  count(articleNumber) as count from myTable 
   group by orderNumber

) t2
on t1.orderNumber = t2.orderNumber  
order by t2.count desc, t1.orderNumber, t1.articleNumber

为了更好地表现出来:

我们首先选择所有数据,然后我们内部加入一个具有每个订单号的计数的表,一旦我们有了这个,我们就可以按计数DESC订购它,所以我们得到订单号最高排名,我们可以在Order By

中添加其他排序

答案 1 :(得分:0)

为了未来读者的利益(当MySQL 8.x已准备好生产且支持窗口函数时),您可以使用COUNT() OVER(partition by ...)来避免中间子查询并加入:

select t1.orderNumber,  t1.articleNumber f
from myTable t1
order by
    count(*) over(partition by t1.orderNumber) DESC
  , t1.orderNumber
  , t1.articleNumber
;
orderNumber |  f
----------: | -:
        456 |  1
        456 |  2
        456 |  3
        456 |  4
        456 |  5
        123 |  1
        123 |  2
        123 |  3
        234 |  1
        234 |  2
        345 |  1

ps:上面的示例在MariaDB 10.2中完成,以显示工作中的MySQL(ish)语法(无论如何,它都是标准投诉SQL)。

dbfiddle here

答案 2 :(得分:-1)

如果我正确理解了问题,则以下查询应该有效:

select t1.order_number, t1.Article_number
from t1
inner join (select order_number,count(*) as cnt from t1 group by order_number) as t2
on t1.order_number = t2.order_number
order by t2.cnt desc,t1.order_number,t1.Article_number;

希望它有所帮助!