Алгоритм автоматического добавления уникального идентификатора к дублирующим заголовкам - PullRequest
0 голосов
/ 15 сентября 2009

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

  • Некоторые предметы
  • Заголовок виджета
  • Некоторые другие предметы
  • Заголовок виджета 2
  • Заголовок виджета 3
  • Еще один предмет
  • Заголовок виджета 4

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

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

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

Ответы [ 4 ]

0 голосов
/ 24 октября 2009

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

0 голосов
/ 15 сентября 2009

Я только что добавил это в 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 голосов
/ 24 октября 2009
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), следующая копия «заполнит» это отверстие и будет называться Мой документ 76.

Это T-SQL.

0 голосов
/ 15 сентября 2009

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

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

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

  • Если результат равен нулю, столкновения нет.
  • Если результат совпадает с @newname, добавьте "2"
  • Если в результате получится что-то еще, нарежьте @newname и пробел в начале, преобразуйте в целое число и увеличьте.

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...