2017-04-27 122 views
0

让说我有这个表:如何查询每行的序号索引在MySQL

| Order ID | User | Order Date | 
----------------------------------- 
| 1  | Dave | 03/01/2017 | 
| 2  | Jim | 03/09/2017 | 
| 3  | John | 03/15/2017 | 
| 4  | John | 03/18/2017 | 
| 5  | Jim | 03/18/2017 | 
| 6  | Dave | 03/30/2017 | 
| 7  | John | 04/04/2017 | 
| 8  | Jim | 04/16/2017 | 

事情我想是把一个多列,以指示每个单独的n阶,因为我需要分析用户的重复行为。 所以输出应该是这样的:

| Order ID | User | Order Date | n-th | 
----------------------------------------- 
| 1  | Dave | 03/01/2017 | 1 | 
| 2  | Jim | 03/09/2017 | 1 | 
| 3  | John | 03/15/2017 | 1 | 
| 4  | John | 03/18/2017 | 2 | 
| 5  | Jim | 03/18/2017 | 2 | 
| 6  | Dave | 03/30/2017 | 2 | 
| 7  | John | 04/04/2017 | 3 | 
| 8  | Jim | 04/16/2017 | 3 | 

这意味着:

  • 为了#1 Dave的一阶
  • 为了#2是吉姆的一阶 ...
  • 秩序#5是吉姆的第二张订单

等等!
如何在SQL中使用原始查询来获取此信息?
谢谢。

+0

请参阅http://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve-for-what-seems-to-me-to-be-a-very-simple- sql-query – Strawberry

回答

1

在大多数数据库中,您将使用row_number()。在MySQL中,这是最好的使用变量完成:

select t.*, 
     (@rn := if(@u = user, @rn + 1, 
        if(@u := user, 1, 1) 
       ) 
     ) as nth 
from t cross join 
    (select @u := '', @rn := 0) params 
order by user, orderdate; 

您也可以使用制定相关子查询此查询,但使用变量的方法应该有更好的表现。

要将数据恢复为其原始格式,请使用上述作为子查询,然后按照订单ID进行排序。

+0

嗨戈登,谢谢你的建议。但是,我期望的输出是我上面的问题,数据只能按OrderId排序,因此每个个体的“第n个”在整个结果集中都是稀疏的。 在你的情况下,为了使'row_number'工作,那么我们必须通过'user'首先对输出进行重新排序 –

+0

@ĐinhHồngChâu。 。 。只需使用上面的子查询,然后点按您的喜好。 –