0

我有一个用户将一段数据输入我的数据库并将其命名为“Widget Title”。如果他调用另一个项目“小部件标题”,另一个,另一个,当他在他的小部件列表中看到它们时,我想像这样显示它们:

  • 一些项目
  • 小部件标题
  • 其他一些项目
  • 小部件标题 2
  • 小部件标题 3
  • 另一个项目
  • 小部件标题 4

每个重复出现都有自己附加的递增 id。

您会在进入数据库的过程中执行此操作,还是在显示列表的输出时执行此操作?

我可以有算法吗?

4

4 回答 4

0

嗯......在保存之前尝试这样的事情:

 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 编写的,但 IIRC 的 LIKE 通配符语法与其他语法类似。)

于 2009-09-15T05:08:53.887 回答
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);
于 2009-09-15T05:13:58.277 回答
0
声明@name nvarchar(40)
声明@suffix int
声明@currentName nvarchar(50)
设置@name = '我的文档'
设置@suffix = 1
设置@currentName = @name
虽然存在(从 [table] 中选择 1,其中 [name] = @currentName)
开始
    设置@currentName = @name + ' ' + cast(@suffix as nvarchar(10))
    设置@suffix = @suffix + 1
结尾

@name 最终将成为“我的文档 142”(如果还有 141 个其他副本)。请注意,如果您删除了中间的副本(例如,副本 76),则下一个副本将“填充”该孔并称为我的文档 76。

这是 T-SQL。

于 2009-10-23T21:09:05.830 回答
0

我只是使用串行 PK 并将其与文本一起显示给用户。

于 2009-10-23T21:12:17.100 回答