2016-07-12 4 views
1

私はリスト項目のテーブルを持っています。リストアイテムをグループ化する識別子として使用されるListID列があります。各項目にソート順を与えるには、リストごとに0で始まり、項目ごとに1つずつ増分する方法がありますか?別のフィールドに基づいて複数のグループがある場合、SortOrderカラム(たとえば0,1,2,3)を初期化する最良の方法は何ですか?

基本的には、多数のエントリ/ ListIDに対して、次のSortOrder Column値を設定する必要があります。

ID ListID SortOrder 
1  1   0 
2  0   0 
3  1   1 
4  0   1 
5  1   2 
6  0   2 
7  2   0 
8  2   1 
9  2   2 
+0

SQL Server 2005以降を使用している場合、ROW_NUMBER()関数がこのトリックを行います。 –

+1

貼り付けたコードはSQLサーバーではなく、MySQL用です –

+0

Woops、私は気付かずに、どこから始めたらいいか分からなかったので、私は周りを見回していました。私はROW_NUMBER()を使うことができると仮定しましたが、グループでそれを行うことが可能かどうかはわかりませんでした。 – Marie

答えて

2

あなたはこのためにListIdフィールド上PARTITIONROW_NUMBER()を使用することができます。

Select Id, ListId, 
     Row_Number() Over (Partition By ListId Order By Id) -1 As SortOrder 
From  YourTable 
Order By Id 
+0

これは完全に働きました。 -1は何をするのですか? – Marie

+0

@Marie 'ROW_NUMBER()'は、 'OVER'ステートメントで定義された' PARTITION'と 'ORDER'に基づいてレコードにインクリメントする番号を割り当てます。割り当てられた番号は「1」で始まるので、「-1」部分は割り当てられた番号を「0」から始めることである。 – Siyual

0

あなたがリストの間で共有されているアイテムを含むリストの順序を保持する必要がありますか?もしそうならば、おそらくこのスキーマのバリエーションがあなたのために働くでしょう。

Item 
id label 
1  A 
2  B 
3  C 
4  D 

List 
id listName 
1  abc list 
2  cbd list 
3  aaa list 

ListMembership 
id listId itemId order 
1  1  1  1 
2  1  2  2 
3  1  3  3 
4  2  2  2 
5  2  3  1 
6  2  4  3 
7  3  1  1 
8  3  1  2 
9  3  1  3 

用法:

select i.label from listMembership as lm 
    join Item as i on i.id=lm.itemId 
    where lm.listId=2 
    order by lm.order 

利回り:

label 
C 
B 
D 
+0

私は良いスキーマを持っています(基本的にそのように見えます)。私の問題は、古いデータを埋め戻す必要があることと、古い構造に一致するすべての並べ替え順序を与える必要があることです – Marie

1

私はあなたがしたいと思う:

WITH toupdate as (
     SELECT t.*, 
      ROW_NUMBER() OVER (PARTITION BY ListId Order By id) as new_SortOrder 
     FROM tableName 
    ) 
UPDATE toupdate a 
    SET sortorder = new_sort_order; 

SQL Serverは、サブクエリまたはCTEの下を更新する素敵な能力を持っていますいくつかの状況。

関連する問題