2009-09-15 3 views
0

데이터를 내 데이터베이스에 입력하고 "위젯 제목"이라는 사용자가 있습니다.중복 제목에 고유 ID 자동 추가 알고리즘

  • 일부 항목
  • 위젯 제목
  • 을 : 그는 다른 항목 "위젯 제목", 또 다른, 다른, 그는 자신의 위젯 목록에서 그들을 볼 때 나는 그런처럼 보여 싶습니다를 호출하는 경우 일부 다른 항목
  • 위젯 제목이
  • 위젯 제목 3
  • 또 다른 항목
  • 위젯 제목 4

각 중복 발생에는 고유 한 증분 ID가 추가됩니다.

데이터베이스로가는 도중에 또는 목록 출력을 표시 할 때이 작업을 수행 하시겠습니까?

알고리즘을 사용할 수 있습니까?

답변

0

난 그냥 출력에 사용하기 위해 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

는 흠 ... 저장하기 전에 이런 식으로 뭔가를 시도 : 당신에게 "마지막으로 사용한"이름을 줄 것이다

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

. 결과가 null의 경우 결과가 @newname 같은 경우

  • 는, 결과는 아무것도 다른 경우,
  • "2"를 추가 해제 @newname과 공간을 잘라 충돌
  • 없다 정면은 정수로 변환하고 증가시킵니다.

물론 이것은 9 개의 중복 또는 주어진 이름의 총 10 개의 인스턴스에 대해서만 적용됩니다. 이 방법을 더 많이 사용하려면 항상 두 자리 접미사 (02, 03 등)를 사용하고 LIKE 절을 일치하도록 변경해야합니다.

는 (당신은 RDBMS를 지정하지 않은, 그래서 이것은 마이크로 소프트 SQL 서버를위한 것입니다,하지만 IIRC는 LIKE 와일드 카드 구문은 다른 사람과 비슷합니다.)

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

@ 이름 (141 개 사본이 다른 경우) "내 문서 (142)"로 끝나게된다. 가운데 사본 (예 : 사본 76)을 삭제하면 다음 사본이 해당 구멍을 "채우고"내 문서 76이라고합니다.

이것은 T-SQL입니다.

0

난 그냥 직렬 PK를 사용하여 텍스트 옆에 사용자에게 보여줍니다.