2017-10-07 41 views
1

この質問はmysql compress order_by valuesの拡張です。MySQLの注文グループ値

私のテーブルには、望ましくない隙間を持つ注文番号のグループがあります。元の注文を維持しながら、これらのグループのそれぞれの番号をどのように変更することができますか?

Group Order Desired Order 
A  1  1 
A  3  2 
A  6  3 
A  7  4 

B  2  1 
B  3  2 
B  8  3 

C  1  1 
C  7  2 
C  8  3 
+0

はギャップを心配しないでください! – Strawberry

答えて

0

また、使用して変数

select t1.*, 
(
    select count(*) 
    from demo t2 
    where t1.`group` = t2.`group` 
    and t1.`order` > t2.`order` 
) + 1 desiredorder 
from demo t1 

DEMO

それとも、クエリの下に使用することができますご希望の順序で同じテーブルを更新することなく、相関サブクエリを使用して所望の順序を取得することができます

update demo a 
join (select t1.*,(
     select count(*) 
     from demo t2 
     where t1.`group` = t2.`group` 
     and t1.`order` > t2.`order` 
     ) + 1 desiredorder 
     from demo t1 
) b on a.`group` = b.`group` 
    and a.`order` = b.`order` 
set a.`order` = b.desiredorder 

DEMO

パフォーマンスを向上させるために、グループおよび注文列にインデックスを追加してください。

0

あなたはgroupの前回値とdesiredorderのための別のものを格納する変数を作成することができます。基本的に、これはMySqlがサポートしていないウィンドウ関数ROW_NUMBERの模倣です。

私はgroup=col1, order=col2

select col1, 
     col2, 
     neworder 
from (
    select t.col1, 
     t.col2, 
     case when @prev=t.col1 then @id:[email protected]+1 else @id:=1 end as neworder, 
     @prev:=t.col1 
    from (select @prev:=null, @id:=0) a, 
     toorder t 
    order by t.col1 
) a 

として列の名前を変更し、それはここで働いてください:http://sqlfiddle.com/#!9/9d8528/2

あなただけのこれらの3つの列を引き出したい場合は、外部クエリにのみ必要とされています。