質問
データベースにデータを入力し、「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を使用して、テキストとともにユーザーに表示します。
所属していません StackOverflow