MySQL中没有会话变量的分组数据的排名顺序?

MySQL中没有会话变量的分组数据的排名顺序?,mysql,sql,session-variables,ranking,rank,Mysql,Sql,Session Variables,Ranking,Rank,我的数据如下所示: Table Name = sales_orders Customer_id| Order_id| Item_Id ------------------------------- 1 | 1 | 10 1 | 1 | 24 1 | 1 | 37 1 | 2 | 11 1 | 2 | 15 1 | 3 | 28

我的数据如下所示:

Table Name = sales_orders

Customer_id| Order_id| Item_Id
-------------------------------
1          | 1      | 10
1          | 1      | 24
1          | 1      | 37
1          | 2      | 11
1          | 2      | 15
1          | 3      | 28
2          | 4      | 37
4          | 6      | 10
2          | 7      | 10
Customer_id| Order_id| Item_Id |Order_rank
------------------------------------------
1          | 1      | 10       |    1   
1          | 1      | 24       |    1
1          | 1      | 37       |    1
1          | 2      | 11       |    2
1          | 2      | 15       |    2
1          | 3      | 28       |    3
2          | 4      | 37       |    1
4          | 6      | 10       |    1
2          | 7      | 10       |    2
但是,我需要它看起来像这样:

Table Name = sales_orders

Customer_id| Order_id| Item_Id
-------------------------------
1          | 1      | 10
1          | 1      | 24
1          | 1      | 37
1          | 2      | 11
1          | 2      | 15
1          | 3      | 28
2          | 4      | 37
4          | 6      | 10
2          | 7      | 10
Customer_id| Order_id| Item_Id |Order_rank
------------------------------------------
1          | 1      | 10       |    1   
1          | 1      | 24       |    1
1          | 1      | 37       |    1
1          | 2      | 11       |    2
1          | 2      | 15       |    2
1          | 3      | 28       |    3
2          | 4      | 37       |    1
4          | 6      | 10       |    1
2          | 7      | 10       |    2
客户Id是唯一的个人

订单id是唯一的订单

item_id是产品代码

为了进一步解释,前三行来自客户#1的第一份订单(订单id=1),其中此人订购了3种不同的商品(10、24和37)。然后,他们用另外两种产品购买了另一个订单(订单号=2)。客户id=2的人有两个唯一订单(4和6),而id为“4”的客户有一个唯一订单(订单id=6)

本质上,我需要做的是按照客户id和订单id对这些订单进行排序,这样我就可以说“订单id=7是客户id=2的第二个订单,因为订单id=2”

这里的挑战是我不能在MySQL查询中使用会话变量(例如@grp:=customer\u id)

例如,不允许这样的查询:

SELECT 
customer_id,
order_id,
@ss := CASE WHEN @grp = customer_id THEN @ss + 1 ELSE 1 END AS 
order_rank,
@grp := customer_id 
FROM 
(
SELECT 
customer_id,
order_id
FROM sales_orders
GROUP BY customer_id, order_id
ORDER BY customer_id, order_id ASC
) AS t_1
CROSS JOIN (SELECT @ss := 0, @grp = NULL)ss

ORDER BY customer_id asc

谢谢你的帮助

您可以使用相关子查询:

select so.*,
       (select count(*)
        from sales_orders so2
        where so2.Customer_id = so.Customer_id and
              so2.order_id <= so.order_id
       ) as rank_order
from sales_orders so;
在a中,我们可以对特定行的
客户id
订单id
唯一和先前的
订单id
值进行
计数(…)
以确定排名

我们需要计算唯一值,因为每个订单有多行(由于多个项目)


查询

SELECT 
  t1.Customer_id, 
  t1.Order_id, 
  t1.Item_Id, 
  (SELECT COUNT(DISTINCT t2.Order_id) 
   FROM sales_orders t2 
   WHERE t2.Customer_id = t1.Customer_id AND 
         t2.Order_id <= t1.Order_id
  ) AS Order_rank 
FROM sales_orders AS t1;