2009-09-15 2 views
0

У меня есть пользователь, который вводит часть данных в мою базу данных и называет ее «Название виджета». Если он называет еще один пункт «Название виджета», и другой, и другой, когда он видит их в своем списке виджетов, я хотел бы показать им, как, например:Алгоритм автоматического добавления уникального идентификатора в дубликаты заголовков

  • Некоторые Item
  • Widget Название
  • Some Other Item
  • Название виджета 2
  • Название виджета 3
  • Еще один Item
  • Название виджета 4

Где каждое повторяющееся вхождение имеет свой добавочный инкрементирующий идентификатор.

Вы сделали бы это по пути в базу данных или когда вы будете отображать выходные данные для списка?

Могу ли я получить алгоритм?

ответ

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); 
0

Хм ... попробовать что-то вроде этого перед сохранением:

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

Это даст вам «последний используемый» имя.

  • Если результат нулевой, нет никакого столкновения
  • Если результат такой же, как @newname, добавить «2»
  • Если результат все остальное, измельчить @newname и пространство от фронт, преобразовать в целое число и увеличивать.

Конечно, это будет охватывать вас только для 9 дубликатов или всего 10 экземпляров данного имени. Чтобы использовать этот подход для большего, вам нужно будет всегда использовать двузначный суффикс (02, 03 и т. Д.) И изменить предложение LIKE для соответствия.

(Вы не указали РСУБД, так что это написано для Microsoft SQL Server, но IIRC Одноименных синтаксис подстановочных похожи на других.)

0
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

@ имя будет в конечном итоге "Мой документ 142" (если есть 141 другие копии). Обратите внимание: если вы удалите копию посередине (скажем, копию 76), следующая копия «заполнит» это отверстие и будет называться My Document 76.

Это T-SQL.

0

Я просто использую серийный ПК и показываю его пользователю вместе с текстом.