您可以在一个mySQL查询中包含总计行和明细行吗?
档案上的问题似乎都不是关于我的确切问题 是否可以根据单个查询中该顺序的明细行数对明细行排序 考虑以下简化表格:您可以在一个mySQL查询中包含总计行和明细行吗?,mysql,Mysql,档案上的问题似乎都不是关于我的确切问题 是否可以根据单个查询中该顺序的明细行数对明细行排序 考虑以下简化表格: Order number Article number ------------ -------------- 123 1 123 2 123 3 234 1 234 2 345 1 456 1 456 2 456
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
我可以通过多个查询、临时表或额外的列来实现。无论是简单的选择、自联接还是联合,似乎都不能提供我想要的结果。是否可以使用单个查询?如果我正确理解问题,以下查询应该可以工作:
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;
希望有帮助 如果我正确理解了问题,以下查询应该可以工作:
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;
希望有帮助 此查询应该可以工作,因为它从联接中获取计数,然后根据计数对其排序
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
为了更好地解释它:
我们首先选择所有的数据,然后我们将内部连接一个表,该表具有每个订单号的计数,一旦我们有了这个,我们就可以按计数对它进行排序,这样我们就可以得到顶部计数最高的订单号,然后我们可以在排序方式中添加额外的排序。这个查询应该可以工作,因为它从连接中获取计数,然后按计数对它进行排序
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
为了更好地解释它:
我们首先选择所有的数据,然后我们在内部加入一个表,该表有每个订单号的计数,一旦我们有了这个数据,我们就可以按计数对其进行排序,这样我们就可以得到顶部计数最高的订单号,然后我们就可以根据未来读者的兴趣在排序中添加额外的排序(当MySQL 8.x已准备好生产并且支持窗口函数时),您可以通过在(分区依据…)上使用
COUNT()来避免中间子查询和连接,如下所示:
订单号| 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为了未来读者的利益(当MySQL 8.x已经准备好生产并且支持窗口函数时),您可以通过使用(COUNT()OVER(partition by…)
来避免中间子查询和连接,如下所示:
订单号| 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这似乎是以前问过的问题,物品数量是否平分您希望物品编号按相同顺序内部混合还是按顺序分开。如果分开,领带是否有顺序?这似乎是以前问过的问题,物品数量是否平分您希望物品编号分开同一顺序的内部混合或按顺序分开。如果分开,领带是否有任何顺序?order by articleNumber引用不明确,您可能需要T1.articleNumber。(子查询/派生表/inlineview中不需要商品编号,为什么要包括它?;您可以按它而不是*)解释一下你的方法也很好。因为最初的问题似乎在这方面有问题。另外,如果count有联系,你会混合订单号。在数据中没有这样的例子,但可能不是OP想要的;因此你可能希望在articleNumber之前按订单号订购,以更干净地处理联系。感谢@xQbert的命令nts,你说得对,我做了调整。谢谢。这就解决了问题。我接受了这个答案。按项目编号排序的引用不明确。你可能想要T1.articleNumber。(子查询/派生表/inlineview中不需要项目编号,为什么要包括它?;你可以按项目编号而不是*)解释一下你的方法也很好。因为最初的问题似乎在这方面有问题。另外,如果count有联系,你会混合订单号。在数据中没有这样的例子,但可能不是OP想要的;因此你可能希望在articleNumber之前按订单号订购,以更干净地处理联系。感谢@xQbert的命令nts,你是对的,我做了调整。谢谢。这解决了问题。我接受了这个答案。