2016-06-11 1 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) 

次の行の名前は、「新しい名前(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

これをしなかった:

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というパラメータで指定されていることを前提としています。

注:上記のクエリは新しい名前を生成します。次の番号を順番に取得する方法は明白です。トリックは、GorodonLinoffの答え@おかげ

+0

うーん何かが欠けているようだが、私は句はそれほどうまくいかなかったところ、私が代わりに地雷を使用し、クエリで遊んで試してみました。その最大値(名前REGEXP $ name = 0)、次に$ name'を追加することで修正可能な数値を持たない$ nameを持たないときに何が起こるのかが分かりません。しかし、クエリは「最大」のためにギャップを埋めるものではないようです。 –

+0

@KostyaSydoruk。 。 。今働いているはずです。 –

+0

@GorodonLinoffほとんどの場合、それはギャップを埋めるものではなく、すでに$ name(1)などを持っている間に$ nameを持たないケースを処理しませんでした。私はそれをサポートするためにあなたの質問を修正しました。 –

関連する問題