고유 한 ID를 자동으로 제공하기위한 알고리즘 제목을 복제합니다

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

  •  07-07-2019
  •  | 
  •  

문제

데이터베이스에 데이터를 입력하고 "위젯 제목"을 제목으로하는 사용자가 있습니다. 그가 다른 아이템을 "위젯 제목"이라고 부르고 다른 것들이 위젯 목록에서 그들을 볼 때 나는 그들과 같은 것을 보여주고 싶습니다.

  • 일부 항목
  • 위젯 제목
  • 다른 항목
  • 위젯 제목 2
  • 위젯 제목 3
  • 또 다른 항목
  • 위젯 타이틀 4

각 중복 발생에 자체가 추가 된 증분 ID가 있습니다.

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

알고리즘을 가질 수 있습니까?

도움이 되었습니까?

해결책 2

방금 출력에 사용하기 위해 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);

다른 팁

흠 ... 저장하기 전에 이와 같은 것을 시도하십시오.

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

그것은 당신에게 "마지막 중고"이름을 줄 것입니다.

  • 결과가 null이면 충돌이 없습니다.
  • 결과가 @NewName과 동일하면 "2"를 추가하십시오.
  • 결과가 다른 것이 있으면 @NewName과 전면에서 공간을 잘라 내고 정수로 변환하고 증분하십시오.

물론 이것은 9 개의 복제물 또는 주어진 이름의 총 10 개의 인스턴스에 대해서만 당신을 커버합니다. 이 접근법을 더 많이 사용하려면 언제나 두 자리 접미사 (02, 03 등)를 사용하고 일치하도록 유사 절 항을 변경하십시오.

(RDBMS를 지정하지 않았으므로 이것은 Microsoft SQL Server 용으로 작성되었지만 IIRC는 다른 WildCard Syntax와 비슷합니다.)

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은 결국 "내 문서 142"(141 개의 다른 사본이있는 경우)가됩니다. 중간에 사본을 삭제하면 (사본 76) 다음 사본은 해당 구멍을 "채우고"내 문서 76이라고 불립니다.

이것은 t-sql입니다.

직렬 PK를 사용하여 텍스트와 함께 사용자에게 보여줍니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top