2017-04-10 40 views
0

我想要做的(有點)與this old post有關的是相反的;根據group by和ID添加一個(半)連續的數字,然後標記最新的兩個項目

這裏是我的示例表:

ID NAME  
---- ---- 
1 Apple 
2 Apple 
3 Apple 
4 Bravo 
5 Bravo 
6 Cat 
7 Cat 
8 Cat 
9 Cat 
10 Apple 
11 Apple 

我想添加一個新行,增加了一個順序編號爲每個組項目。問題是有些項目多次出現,但不屬於同一組。如果它們依次出現(順序標識),它們只屬於一個。

更新後的表應該是這樣的:

ID GROUP NAME  
---- ----- ---- 
1 1  Apple 
2 1  Apple 
3 1  Apple 
4 2  Bravo 
5 2  Bravo 
6 3  Cat 
7 3  Cat 
8 3  Cat 
9 3  Cat 
10 4  Apple 
11 4  Apple 

然後作爲最後一步,我想單獨標記每個組的最新的兩個項目(具有最高ID值的),一種像這樣:

ID GROUP NAME MARK  
---- ----- ---- ---- 
1 1  Apple false 
2 1  Apple true 
3 1  Apple true 
4 2  Bravo true 
5 2  Bravo true 
6 3  Cat false 
7 3  Cat false 
8 3  Cat true 
9 3  Cat true 
10 4  Apple true 
11 4  Apple true 

我該怎麼在MySQL中做到這一點?

+0

您是標記假下部/舊的ID不是最新 –

+0

要分配,其經由被有條件地遞增一組使用可變在線分配。對於第二項任務 - 請注意,如果您反轉訂單,最後兩項將成爲前兩項。 –

回答

1

使用變量,首先你通過id和name創建組順序,然後對這些grp的id進行排序,標記前兩個。

SQL DEMO

SELECT `ID`, `NAME`, rn, 
     mark <= 2 as mark  
FROM (
     SELECT `ID`, `NAME`, rn, 
       @mark := IF(@grp = rn, 
          @mark + 1, 
          IF(@grp := rn, 1, 1)          
          ) as mark 
     FROM (  
       SELECT `ID`, `NAME`, 
         @rn := IF(@name = `NAME`, 
           @rn, 
           IF(@name := `NAME`, @rn + 1, @rn + 1) 
           ) as rn 
       FROM Table1 
       CROSS JOIN (SELECT @rn := 0, @name :='') var 
       ORDER BY `ID` 
      ) T 
     CROSS JOIN (SELECT @mark := 0, @grp := 0) var 
     ORDER BY rn, `ID` DESC 
    ) Y 
ORDER BY ID  

OUTPUT

enter image description here

+0

完美的作品,謝謝! – rayne

相關問題