2016-06-11 36 views
0

我有一个名称列的表。最初名称不会添加到表中,但我希望在插入新行时添加默认名称,这与创建新文件时窗口的功能非常相似。我试图弄清楚如何查询序列中假设的下一个数字。MySQL插入功能类似于Window的默认文件命名

例如,如果我的表看起来像这样:

id | name 
========== 
1 | New Name (1) 
2 | real name 
3 | New Name 

下一个插入的行的名称应该是“新的名称(2)”。如果我的表看起来像这样:

id | name 
========== 
1 | New Name (2) 
2 | real name 

或本:

id | name 
========== 
1 | another name 
2 | real name 

下一个插入的行的名称应该是“新名”。如果我的表如下所示:

id | name 
========== 
1 | New Name (2) 
2 | real name 
3 | New Name 
4 | New Name (3) 

下一个插入的行的名称应该是“New Name(1)”。到目前为止我能创建查询,以获得现有的数字(“新名称” = 0)

SELECT SUBSTRING_INDEX(SUBSTR(d.name,INSTR(d.name,'(') + 1), ')', 1) 
    FROM data d 
    WHERE d.widget_name REGEXP '^New[[:space:]]Name[[:space:]]\\([[:digit:]]\\)$' 
    UNION 
    SELECT 0 
    FROM data d 
    WHERE d.name REGEXP '^New[[:space:]]Name$' 

现在我需要一种方法来转数的清单提交给一个数字将显示最新的下一个默认名称枚举。我试过使用NOT EXISTSfrom this question但我不知道如何使用FROMWHERE上面的代码。

我也尝试通过使用a_horse_with_no_name's answer in this question创建row_num功能来做到这一点。假设num_data是查询的结果(试图保持它的清洁)表和它的列名是name_num:

SELECT IFNULL(row_number, (SELECT IFNULL(MAX(name_num),0) 
          FROM num_data)) 
    FROM (SELECT @rownum:[email protected] + 1 AS row_number, t.* 
     FROM (num_data) t, 
     (SELECT @rownum := 0) r) gap_table 
    WHERE gap_table.row_number <> gap_table.widget_num 
    ORDER by row_number 
    LIMIT 1; 

但是,这似乎并没有得到它的权利了。

回答

0

这并获得成功,感谢@ GorodonLinoff的回答是:

select (case when count(*) = 0 then '$name' 
      when max(name = '$name') = 0 then '$name' 
      when max(name = '$name(1)') = 0 then '$name(1)' 
      else concat('$name', '(', max(substring_index(name, '(', -1) + 0) + 1, ')') 
     end) 
from data 
where name rlike concat('$name', '[(][0-9]+[)]') or 
     name = '$name'; 
1

如果你想为一个给定名称的下一个名字,我希望查询看起来像这样:

select (case when count(*) = 0 then $name 
      else concat($name, '(', 
         max(substring_index(name, ' (', -1) + 0) + 1, 
         ')') 
     end) 
from num_data 
where name rlike concat($name, ' [(][0-9]+[)]' or 
     name = $name; 

Here是SQL小提琴证明它。

这假定正在测试的名称由名为$name的参数提供。

注意:上述查询生成新名称。如何顺序获得下一个数字应该是显而易见的。

+0

嗯东西似乎缺少,我试着查询玩耍,where子句没有工作,所以我用我的做法。它缺少一个例子,当你没有一个没有数字的$ name的时候会发生什么,这个数字可以通过在max(名字REGEXP $ name = 0)和$ name'上加上这个来修正。但似乎由于'max',查询没有填补空白。 –

+0

@KostyaSydoruk。 。 。应该现在工作。 –

+0

@GorodonLinoff几乎,它没有填补空白,它没有处理没有$ name的情况,而已经有$ name(1)等等。我修改了你的查询来支持它。 –