2017-04-10 6 views
0

this old postとは逆の(少し)したいです。私はアイテムのグループごとに連番を追加する新しい行を追加したいグループとIDに基づいて行に(半)連続番号を追加し、最新の2つの項目をマークします。

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)。

更新されたテーブルは、次のようになります

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 

そして、最後のステップとして、私は一種の、個別に各グループの最新の2つの項目(最高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

偽マークされていますインライン割り当て。 2番目のタスクについては、最後の2つが最初の2つになることに注意してください。 –

答えて

1

変数を使用するまず、IDと名前でグループの順序を作成します。次に、これらのgrpをidにソートすると、最初の2つがマークされます。

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