고유 한 ID를 자동으로 제공하기위한 알고리즘 제목을 복제합니다
-
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를 사용하여 텍스트와 함께 사용자에게 보여줍니다.
제휴하지 않습니다 StackOverflow