2016-04-13 5 views
0

以下のようなテーブル構造を維持しています。ソート順の更新テーブル

 
sortid | id | name 
    1 | 1 | aa 
    3 | 2 | cc 
    4 | 3 | cc 
    2 | 4 | bb 
    5 | 5 | dd 

ここで、sortidは名前の昇順に従って維持されます。 名前 'dd'を 'aa'に更新すると、ソートIDも正しい値に更新されます。

Update table set name="bb" where name like "dd"; 

テーブルを更新した後、以下のようになります。

 
sortid | id | name 
    1 | 1 | aa 
    4 | 2 | cc 
    5 | 3 | cc 
    3 | 4 | bb 
    2 | 5 | aa 
+0

表の行にはソート順序を持っていません。 'SortId'はあなたが望むものに更新できる数字です。実際には、SQL文は、 'ORDER BY'文を指定しないかぎり、必要な順序で行を返すことができます –

+0

質問はどのようにしてsingle statementでsortidを更新できますか? – kiranjc

答えて

0

このsortidは、この行の前にソートされる行の数です。

ですから、行カウントすることにより、それを計算することができます

UPDATE MyTable 
SET sortid = (SELECT COUNT(*) 
       FROM MyTable AS T2 
       WHERE T2.name < MyTable.name) + 
      (SELECT COUNT(*) 
       FROM MyTable AS T2 
       WHERE T2.name = MyTable.name 
       AND T2.id <= MyTable.id); 

を(第二サブクエリが重複した名前から生じるsortid値を複製解決)

+0

それは複雑ではありませんか?これは、すべてのエントリを持つすべてのエントリに対して2つの文字列比較を実行しているためです。 – kiranjc

+0

これはこれまでのすべての回答の*少なくとも*複雑な答えです。 –