如何查询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。只需使用上面的子查询,然后按您喜欢的方式排序。