2017-04-22 61 views
1

我有下面的查询,我想要做的是添加一列,将确定这是一个不同的客户的顺序。 entity_id每个订单都是唯一的,所以我真正想要做的是为created_at订购的每个客户编号唯一的entity_id。问题在于订单中的每个商品都有一行,因此它对我当前的查询编号错误。MySQL行编号没有得到想要的结果

这是目前的结果

Order Date   ,OrderID, SKU ,Qty  ,Customer Email ,First,last ,seqnum 
'2015-04-01 14:48:13','19406','201','2.0000','[email protected]','joe','vers','1' 
'2015-04-01 14:48:13','19406','201','2.0000','[email protected]','joe','vers','2' 
'2015-04-01 14:48:13','19406','201','2.0000','[email protected]','joe','vers','3' 
'2015-04-01 14:48:13','19406','201','2.0000','[email protected]','joe','vers','4' 
'2015-04-01 14:48:13','19406','201','2.0000','[email protected]','joe','vers','5' 
'2015-04-01 14:48:13','19406','103','1.0000','[email protected]','joe','vers','6' 
'2015-04-01 14:48:13','19406','102','1.0000','[email protected]','joe','vers','7' 
'2015-04-01 14:48:13','19406','102','1.0000','[email protected]','joe','vers','8' 
'2015-04-01 14:48:13','19406','102','1.0000','[email protected]','joe','vers','9' 
'2015-04-01 14:48:13','19406','201','1.0000','[email protected]','joe','vers','10' 
'2015-04-01 14:48:13','19406','102','1.0000','[email protected]','joe','vers','11' 
'2015-04-01 14:48:13','19406','105','1.0000','[email protected]','joe','vers','12' 
'2015-04-13 17:45:15','20537','105','1.0000','[email protected]','joe','vers','13' 
'2015-04-13 17:45:15','20537','102','1.0000','[email protected]','joe','vers','14' 
'2015-04-13 17:45:15','20537','201','1.0000','[email protected]','joe','vers','15' 
'2015-04-13 17:45:15','20537','201','1.0000','[email protected]','joe','vers','16' 
'2015-04-29 14:42:28','22212','102','1.0000','[email protected]','joe','vers','17' 
'2015-05-11 17:11:22','23301','102','1.0000','[email protected]','joe','vers','18' 

这是理想的结果

Order Date   ,OrderID, SKU ,Qty  ,Customer Email ,First,last ,seqnum 
'2015-04-01 14:48:13','19406','201','2.0000','[email protected]','joe','vers','1' 
'2015-04-01 14:48:13','19406','201','2.0000','[email protected]','joe','vers','1' 
'2015-04-01 14:48:13','19406','201','2.0000','[email protected]','joe','vers','1' 
'2015-04-01 14:48:13','19406','201','2.0000','[email protected]','joe','vers','1' 
'2015-04-01 14:48:13','19406','201','2.0000','[email protected]','joe','vers','1' 
'2015-04-01 14:48:13','19406','103','1.0000','[email protected]','joe','vers','1' 
'2015-04-01 14:48:13','19406','102','1.0000','[email protected]','joe','vers','1' 
'2015-04-01 14:48:13','19406','102','1.0000','[email protected]','joe','vers','1' 
'2015-04-01 14:48:13','19406','102','1.0000','[email protected]','joe','vers','1' 
'2015-04-01 14:48:13','19406','201','1.0000','[email protected]','joe','vers','1' 
'2015-04-01 14:48:13','19406','102','1.0000','[email protected]','joe','vers','1' 
'2015-04-01 14:48:13','19406','105','1.0000','[email protected]','joe','vers','1' 
'2015-04-13 17:45:15','20537','105','1.0000','[email protected]','joe','vers','2' 
'2015-04-13 17:45:15','20537','102','1.0000','[email protected]','joe','vers','2' 
'2015-04-13 17:45:15','20537','201','1.0000','[email protected]','joe','vers','2' 
'2015-04-13 17:45:15','20537','201','1.0000','[email protected]','joe','vers','2' 
'2015-04-29 14:42:28','22212','102','1.0000','[email protected]','joe','vers','3' 
'2015-05-11 17:11:22','23301','102','1.0000','[email protected]','joe','vers','4' 

这是查询:

select sfo.created_at AS "Order Date", sfo.entity_id AS "Order ID", 
     left(sfoi.sku,3) AS "SKU", sfoi.qty_ordered, 
     sfo.customer_email AS "Customer Email",  
     sfo.customer_firstname AS "Customer Firstname",  
     sfo.Customer_lastname AS "Customer Lastname", 
     (@rn := if(@e = sfo.customer_email, @rn + 1, 
        if(@e := sfo.customer_email, 1, 1) 
       ) 
     ) as seqnum 
from sales_flat_order sfo join 
    sales_flat_order_item sfoi 
    on sfoi.order_id = sfo.entity_id join 
    sales_flat_order_address sfoa   
    on sfoa.entity_id = sfo.billing_address_id cross join 
    (select @rn := 0, @e := '') params 
order by sfo.customer_email, created_at; 

回答

0

啊,我明白了。 订单是基于电子邮件地址的数字。好的。

select sfo.created_at AS "Order Date", sfo.entity_id AS "Order ID", 
     left(sfoi.sku,3) AS "SKU", sfoi.qty_ordered, 
     sfo.customer_email AS "Customer Email",  
     sfo.customer_firstname AS "Customer Firstname",  
     sfo.Customer_lastname AS "Customer Lastname", 
     (@rn := if(@e = sfo.customer_email, 
        if(@o = sfo.entity_id, @rn, 
        if(@o := sfo.entity_id, @rn + 1, @rn + 1 
         ) 
        ), 
        if(@e := sfo.customer_email, 
        if(@o := sfo.entity_id, 1, 1), 
        if(@o := sfo.entity_id, 1, 1) 
        ) 
       ) 
     ) as seqnum 
from sales_flat_order sfo join 
    sales_flat_order_item sfoi 
    on sfoi.order_id = sfo.entity_id join 
    sales_flat_order_address sfoa   
    on sfoa.entity_id = sfo.billing_address_id cross join 
    (select @rn := 0, @e := '', @o := -1) params 
order by sfo.customer_email, created_at, orderid; 

这假定created_at对于每个顺序是相同的。

+0

非常感谢你,如果你有时间,我会很开心,因为我不熟悉MySql,所以我很想知道它是如何工作的。 – llerdal

+0

您需要了解如何使用变量。这是一个相当复杂的例子。 –