0

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

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

各重複オカレンスには、独自の増分 ID が追加されます。

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

アルゴリズムを取得できますか?

4

4 に答える 4

0
@name nvarchar(40) を宣言します
@suffix int を宣言する
@currentName nvarchar(50) を宣言します
set @name = 'マイ ドキュメント'
@サフィックスを設定 = 1
@currentName = @name を設定
while exists ([name] = @currentName の [table] から 1 を選択)
始める
    set @currentName = @name + ' ' + cast(@suffix as nvarchar(10))
    @サフィックスを設定 = @サフィックス + 1
終わり

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

これが T-SQL です。

于 2009-10-23T21:09:05.830 に答える
0

シリアル PK を使用して、テキストと一緒にユーザーに表示するだけです。

于 2009-10-23T21:12:17.100 に答える
0

出力で使用するために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);
于 2009-09-15T05:13:58.277 に答える
0

うーん...保存する前に次のようにしてみてください:

 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 ワイルドカード構文は他のものと似ています。)

于 2009-09-15T05:08:53.887 に答える