2009-09-15 6 views
0

J'ai un utilisateur qui entre un élément de données dans ma base de données et le nomme "Widget Title". S'il appelle un autre élément « titre Widget », et un autre, et un autre, quand il les voit dans sa liste widget Je voudrais leur montrer comme tel:Algorithme pour l'ajout automatique d'un ID unique à des doublons

  • Certains article
  • Widget Titre
  • certains Autre article
  • Titre Widget 2
  • Widget Titre 3
  • Encore un autre article
  • Titre Widget 4

Où chaque occurrence en double a son propre identifiant d'incrémentation ajouté. Voulez-vous le faire en entrant dans la base de données ou lorsque vous affichez la sortie pour la liste?

Puis-je avoir l'algorithme?

Répondre

0

Je viens fouetté ce en PHP pour une utilisation sur la production et cela semble bien fonctionner. Feriez-vous quelque chose différemment? Nom

$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

Hmm ... essayer quelque chose comme ça avant d'enregistrer:

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

Cela vous donnera le nom de "dernier utilisé".

  • Si le résultat est nul, il n'y a pas de collision
  • Si le résultat est le même que @newname, append « 2 »
  • Si le résultat est tout autre chose, hacher @newname et l'espace au large le recto, convertir en entier et incrémenter.

Bien sûr, cela ne vous couvrira que pour 9 doublons, soit un total de 10 occurrences d'un prénom. Pour utiliser cette approche pour plus, vous aurez besoin de toujours utiliser un suffixe à deux chiffres (02, 03, etc.) et modifier la clause LIKE de match.

(vous ne spécifiez pas un SGBDR, donc cela est écrit pour Microsoft SQL Server, mais IIRC la syntaxe générique LIKE est similaire dans d'autres.)

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

@ finira par être "Mes documents 142" (s'il y a 141 autres copies). Notez que si vous supprimez une copie au milieu (par exemple, copier 76), la copie suivante sera « remplir » ce trou et être appelé mon document 76.

Ceci est T-SQL.

0

je viens d'utiliser un PK série et le montrer à l'utilisateur à côté du texte.

Questions connexes