2016-06-11 72 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)等等。我修改了你的查詢來支持它。 –