Algoritmo para agregar automáticamente una identificación única a títulos duplicados

StackOverflow https://stackoverflow.com/questions/1425159

  •  07-07-2019
  •  | 
  •  

Pregunta

Tengo un usuario que ingresa un dato en mi base de datos y lo titula "Título del widget". Si llama a otro elemento " Título del widget " ;, y otro, y otro, cuando los ve en su lista de widgets, me gustaría mostrarlos así:

  • Algún artículo
  • Título del widget
  • Algún otro artículo
  • Título 2 del widget
  • Widget Title 3
  • Otro artículo más
  • Título del widget 4

Donde cada aparición duplicada tiene su propia identificación de incremento añadida.

¿Haría esto en el camino a la base de datos o cuando muestre el resultado de la lista?

¿Puedo tener el algoritmo?

¿Fue útil?

Solución 2

Acabo de preparar esto en PHP para usarlo en la salida y parece funcionar bien. ¿Harías 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);

Otros consejos

Hmm ... intente algo como esto antes de guardar:

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

Eso le dará el último "utilizado" nombre.

  • Si el resultado es nulo, no hay colisión
  • Si el resultado es el mismo que @newname, agregue " 2 "
  • Si el resultado es cualquier otra cosa, corte @newname y el espacio del frente, conviértalo en un entero e incremente.

Por supuesto, esto solo lo cubrirá por 9 duplicados, o un total de 10 instancias de un nombre de pila. Para utilizar este enfoque para obtener más información, deberá siempre usar un sufijo de dos dígitos (02, 03, etc.) y cambiar la cláusula LIKE para que coincida.

(No especificó un RDBMS, por lo que está escrito para Microsoft SQL Server, pero IIRC la sintaxis comodín LIKE es similar en otros.)

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 terminará siendo " Mi documento 142 " (si hay 141 copias más). Tenga en cuenta que si elimina una copia en el medio (digamos, copia 76), la siguiente copia completará " ese agujero y se llamará Mi documento 76.

Esto es T-SQL.

Solo uso una PK serie y se la muestro al usuario junto con el texto.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top