2017-04-10 41 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

相关问题