我有一个用户将一段数据输入我的数据库并将其命名为“Widget Title”。如果他调用另一个项目“小部件标题”,另一个,另一个,当他在他的小部件列表中看到它们时,我想像这样显示它们:
- 一些项目
- 小部件标题
- 其他一些项目
- 小部件标题 2
- 小部件标题 3
- 另一个项目
- 小部件标题 4
每个重复出现都有自己附加的递增 id。
您会在进入数据库的过程中执行此操作,还是在显示列表的输出时执行此操作?
我可以有算法吗?
我有一个用户将一段数据输入我的数据库并将其命名为“Widget Title”。如果他调用另一个项目“小部件标题”,另一个,另一个,当他在他的小部件列表中看到它们时,我想像这样显示它们:
每个重复出现都有自己附加的递增 id。
您会在进入数据库的过程中执行此操作,还是在显示列表的输出时执行此操作?
我可以有算法吗?
嗯......在保存之前尝试这样的事情:
SELECT TOP 1 name FROM widgets WHERE name=@newname OR name LIKE (@newname + ' [0-9]' ORDER BY name DESC
这将为您提供“最后使用”的名称。
当然,这只会涵盖 9 个重复项,或总共 10 个给定名称的实例。要更多地使用这种方法,您需要始终使用两位数后缀(02、03 等)并更改 LIKE 子句以匹配。
(您没有指定 RDBMS,因此这是为 Microsoft SQL Server 编写的,但 IIRC 的 LIKE 通配符语法与其他语法类似。)
我只是在 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);
声明@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。
我只是使用串行 PK 并将其与文本一起显示给用户。