首页 > 解决方案 > MySQL 中的行项目数

问题描述

我有一个复杂的查询连接到多个表以显示“交易历史”,我想要一种快速简便的方法来order_id计算line_number. 我用代码完成了它,但出于性能原因,我想用 MySQL 完成它。这是我所拥有的一个例子:

order_id    item_id  
---------   --------
1111111     444444   
1111111     555555   
1111111     666666   
1111112     123333   
1111112     121111   
1111113     123123   
1111114     123123   
1111115     123123   

这就是我想要的样子:

order_id    line_number    item_id      
---------  ------------    ---------    
1111111          1         444444   
1111111          2         555555   
1111111          3         666666   
1111112          1         123333   
1111112          2         121111   
1111113          1         123123   
1111114          1         123123   
1111115          1         123123   

我试过COUNT(order_id)了,但没有奏效,除非有好的方法。谢谢!

MySQL 版本 5.5.43

标签: mysqlsqldatabasecountwindow-functions

解决方案


在 MySQL 8.0 中,只需使用row_number()

select 
    order_id,
    row_number() over(partition by order_id order by item_id) line_number,
    item_id
from mytable
order by order_id, item_id 

在早期版本中,一种解决方案(除了使用变量)是使用子查询进行内联计数:


select
    order_id,
    (
        select 1 + count(*) 
        from mytable t1 
        where t1.order_id = t.order_id and t1.item_id < t.item_id
    ) line_number,
    item_id
from mytable t
order by order_id, item_id

推荐阅读