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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top