2017-04-27 25 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。 。 。只需使用上面的子查詢,然後點按您的喜好。 –