Algoritmo para Auto-Adição de um Unique ID duplicar títulos
-
07-07-2019 - |
Pergunta
Eu tenho um usuário que entra um pedaço de dados no meu banco de dados e títulos que "Widget Título". Se ele chama outro item "Widget Título", e outra, e outra, quando ele vê-los em sua lista de widget que eu gostaria de mostrar-lhes como tal:
- Alguns item
- Widget Título
- algum outro item
- Widget Título 2
- Widget Título 3
- Sim, outro item
- Widget Título 4
Onde cada ocorrência duplicado tem seu próprio ID de incrementar anexado.
Você fazer isso no caminho para o banco de dados ou quando você exibir a saída para a lista?
Posso ter o algoritmo?
Solução 2
Eu só chicoteado isto em PHP para uso em produção e parece funcionar bem. Você faria algo diferente?
$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);
Outras dicas
Hmm ... tentar algo como isto antes de guardar:
SELECT TOP 1 name FROM widgets WHERE name=@newname OR name LIKE (@newname + ' [0-9]' ORDER BY name DESC
Isso vai lhe dar a "última utilização" nome.
- Se o resultado é nulo, não há colisão
- Se o resultado é o mesmo que @newname, append "2"
- Se o resultado for qualquer outra coisa, @newname costeleta eo espaço fora da parte dianteira, converter para um inteiro, e incremento.
Claro, isso só vai cobri-lo para 9 duplicatas, ou um total de 10 casos de um determinado nome. Para usar essa abordagem para mais, você precisa sempre usar um sufixo de dois dígitos (02, 03, etc.) e alterar a cláusula LIKE para corresponder.
(Você não especificou um RDBMS, por isso esta é escrito para Microsoft SQL Server, mas IIRC a sintaxe curinga COMO é semelhante nos outros.)
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 vai acabar sendo "Meu Documento 142" (se há 141 outras cópias). Note que se você excluir uma cópia no meio (por exemplo, copiar 76), a próxima cópia irá "preencher" o buraco e ser chamado My Document 76.
Este é T-SQL.
Eu só uso um PK de série e mostrá-lo para o usuário ao lado do texto.