خوارزمية الإلحاق التلقائي بمعرف فريد للعناوين المكررة

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

  •  07-07-2019
  •  | 
  •  

سؤال

لدي مستخدم يقوم بإدخال جزء من البيانات في قاعدة البيانات الخاصة بي ويسميها "عنوان القطعة".إذا قام بتسمية عنصر آخر "عنوان القطعة"، وآخر، وآخر، عندما يراهم في قائمة عناصر واجهة المستخدم الخاصة به، أود أن أظهرهم على النحو التالي:

  • بعض البند
  • عنوان الأداة
  • بعض العناصر الأخرى
  • عنوان القطعة 2
  • عنوان القطعة 3
  • عنصر آخر
  • عنوان القطعة 4

حيث يكون لكل حدث مكرر معرّف متزايد ملحق به.

هل ستفعل ذلك أثناء دخولك إلى قاعدة البيانات أو عند عرض مخرجات القائمة؟

هل يمكنني الحصول على الخوارزمية؟

هل كانت مفيدة؟

المحلول 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

سيعطيك ذلك اسم "آخر استخدام".

  • إذا كانت النتيجة فارغة، فلا يوجد تصادم
  • إذا كانت النتيجة هي نفس @newname، قم بإلحاق "2"
  • إذا كانت النتيجة أي شيء آخر، فقم بتقطيع @newname والمسافة من المقدمة، وقم بالتحويل إلى عدد صحيح، ثم قم بالزيادة.

بالطبع، سيغطي هذا فقط 9 نسخ مكررة، أو إجمالي 10 مثيلات لاسم معين.لاستخدام هذا الأسلوب لتحقيق المزيد، ستحتاج إلى ذلك دائماً استخدم لاحقة مكونة من رقمين (02، 03، وما إلى ذلك) وقم بتغيير عبارة LIKE للمطابقة.

(لم تقم بتحديد RDBMS، لذا فقد تم كتابته لـ Microsoft SQL Server، ولكن بناء جملة حرف البدل LIKE يشبه IIRC في الآخرين.)

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 سينتهي به الأمر ليكون "My Document 142" (إذا كان هناك 141 نسخة أخرى).لاحظ أنه إذا قمت بحذف نسخة في المنتصف (على سبيل المثال، نسخة 76)، فإن النسخة التالية "سوف تملأ" تلك الفجوة وستسمى My Document 76.

هذا هو T-SQL.

أنا فقط أستخدم PK التسلسلي وأظهره للمستخدم بجانب النص.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top