如何查询MySQL中每行的顺序索引

如何查询MySQL中每行的顺序索引,mysql,sql,ordinals,Mysql,Sql,Ordinals,假设我有这张桌子: | 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

假设我有这张桌子:

| 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是吉姆的第一份订单
  • 第五道菜是吉姆的第二道菜
等等
如何使用SQL中的原始查询获取此信息?

多谢各位

在大多数数据库中,您将使用
行编号()。在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排序。

请参见Hi Gordon,谢谢您的建议。但是,正如我上面的问题所期望的那样,数据只按OrderId排序,因此每个个体的
n次
在整个结果集中是稀疏的。在您的情况下,要使
行数
正常工作,我们必须首先@inhH按
用户
对输出重新排序ồNgchau。只需使用上面的子查询,然后按您喜欢的方式排序。