重複したタイトルに一意のIDを自動追加するアルゴリズム

StackOverflow https://stackoverflow.com/questions/1425159

  •  07-07-2019
  •  | 
  •  

質問

データベースにデータを入力し、「Widget Title」というタイトルを付けるユーザーがいます。彼が別のアイテム「ウィジェットタイトル」を呼び出し、別のアイテムを呼び出した場合、ウィジェットリストでそれらを見つけたら、次のように表示したいと思います。

  • 一部のアイテム
  • ウィジェットのタイトル
  • その他のアイテム
  • ウィジェットのタイトル2
  • ウィジェットのタイトル3
  • まだ別のアイテム
  • ウィジェットのタイトル4

重複が発生するたびに、独自の増分IDが追加されます。

データベースへの途中でこれを行いますか、それともリストの出力を表示しますか?

アルゴリズムを入手できますか

役に立ちましたか?

解決 2

これを出力で使用するためにPHPでホイップしただけで、うまくいくようです。何か違うことをしますか?

    $my_titles_array = array('Some Title',
                         'Widget Name',
                         'Widget Name',
                         'Some Other Title',
                         'Widget Name',
                         'Yet Another Title',
                         'Widget Name'
                         );

$counted_values_array = array_count_values($my_titles_array);

foreach ($my_titles_array as $title)
{
    if($counted_values_array[$title] > 1)
    {
        $matches_array = array_keys($my_titles_array, $title);
        $i=1;

        foreach($matches_array as $match)
        {
            if($i != 1)
            {
                $my_titles_array[$match] = $title. ' '. $i;
            }
            $i++;
        }
    }
}

echo highlight_string(print_r($my_titles_array,true),true);

他のヒント

うーん...保存する前にこのようなことを試してください:

 SELECT TOP 1 name FROM widgets WHERE name=@newname OR name LIKE (@newname + ' [0-9]' ORDER BY name DESC

これにより、「最後に使用した」ものが表示されます。名前。

  • 結果がnullの場合、衝突はありません
  • 結果が@newnameと同じ場合は、"を追加します2"
  • 結果がそれ以外の場合、@ newnameと先頭のスペースを切り取り、整数に変換してからインクリメントします。

もちろん、これは9つの重複、または特定の名前の合計10のインスタンスに対してのみカバーします。このアプローチをさらに使用するには、常に2桁の接尾辞(02、03など)を使用し、一致するようにLIKE句を変更する必要があります。

(RDBMSを指定しなかったため、これはMicrosoft SQL Server向けに記述されていますが、IIRCのLIKEワイルドカード構文は他の構文と似ています。)

declare @name nvarchar(40)
declare @suffix int
declare @currentName nvarchar(50)
set @name = 'My Document'
set @suffix = 1
set @currentName = @name
while exists (select 1 from [table] where [name] = @currentName)
begin
    set @currentName = @name + ' ' + cast(@suffix as nvarchar(10))
    set @suffix = @suffix + 1
end

@nameは「マイドキュメント142」になります。 (他に141個のコピーがある場合)。途中でコピー(たとえば、コピー76)を削除すると、次のコピーが「入力」されることに注意してください。その穴で、マイドキュメント76と呼ばれます。

これはT-SQLです。

シリアルPKを使用して、テキストとともにユーザーに表示します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top