2011-11-25 62 views
0

確定在一個查詢中重複的更新,我有我想要生成將結合基於某種邏輯輸入SQL查詢。我最終需要這個級聯,但是我遇到了一些問題,這些問題比我想要的要多。MySQL的 - SQL - 如何避免

讓我們看看我能不能舉例說明。我有一個表:

 
          CREATE TABLE IF NOT EXISTS doc_lines (
           id bigint(20) NOT NULL AUTO_INCREMENT, 
           file_id bigint(20) NOT NULL, 
           line int(4) NOT NULL, 
           end_line int(4) NOT NULL, 
           type VARCHAR(100), 
           text VARCHAR(5120) NOT NULL, 
           PRIMARY KEY (id), 
           UNIQUE KEY file_id (file_id,line);

      INSERT INTO doc_lines VALUES(1,1,1,1,NULL, 'abcdefg'); 
          INSERT INTO doc_lines VALUES(1,1,2,2,NULL, 'hijkl'); 
          INSERT INTO doc_lines VALUES(1,1,3,3,NULL, 'mn'); 
          INSERT INTO doc_lines VALUES(1,1,4,4,NULL, 'op'); 
          INSERT INTO doc_lines VALUES(1,1,5,5,NULL, 'qrs'); 
          INSERT INTO doc_lines VALUES(1,1,6,6,NULL, 'tuv.'); 
          INSERT INTO doc_lines VALUES(1,1,7,7,NULL, 'wxy'); 
          INSERT INTO doc_lines VALUES(1,1,8,8,NULL, 'zab'); 

我想的價值觀相結合的「文本」時,兩條線在一排匹配特定條件。

例如我現有的查詢是類似以下內容:

 
    UPDATE doc_lines AS a 
    JOIN doc_lines AS b ON a.file_id = b.file_id AND a.end_line + 1 = b.line 
    SET a.end_line = b.end_line, b.type="DELETE", a.text=CONCAT(a.text, " ", TRIM(b.text)) 
    WHERE b.text REGEXP '^[a-z]$'; 

然後我和一個跟進:

 
    DELETE from doc_lines WHERE 'type'="DELETE"; 

我遇到的問題是,1號線的匹配線2,其標誌線2條刪除。 ... 第2點的匹配線3,其標誌線3爲刪除... 第3點的匹配線4,該線標誌4,用於刪除... 等

結果我最終刪除更線比我想要的。

起初,我以爲我能做到這一點,使其跳過所有其他行:

 
    UPDATE doc_lines AS a 
    JOIN doc_lines AS b ON a.file_id = b.file_id AND a.end_line + 1 = b.line 
    SET a.end_line = b.end_line, b.type="DELETE", a.text=CONCAT(a.text, " ", TRIM(b.text)) 
    WHERE b.text REGEXP '^[a-z]$' AND a.type <> "DELETE"; 

但在查詢一個條目的更新似乎並沒有生效,直到查詢完成後,作爲因此上面沒有任何的表現不同......

,因爲我以爲,結果「好了,爲什麼不處理所有的奇數行,然後所有偶數?」,所以我更新我的查詢恰當:

 
    UPDATE doc_lines AS a 
    JOIN doc_lines AS b ON a.file_id = b.file_id AND a.end_line + 1 = b.line 
    SET a.end_line = b.end_line, b.type="DELETE", a.text=CONCAT(a.text, " ", TRIM(b.text)) 
    WHERE b.text REGEXP '^[a-z]$' AND a.line % 2=0; 

這個問題,我需要多次運行查詢,因爲最終我想要1-6行組合和7-8(使用我的例子)。隨後的每個呼叫都會將行與行後的行結合起來。

這樣做的問題是,最終我最終擊中了同樣的情況,與我原來的查詢,我的一些標記線刪除這也被用來標記其他線路爲刪除。

即使我最終旋轉的奇數和偶數的行,或ID,或該end_line,在某一點似乎最終被重疊。

任何想法?有沒有辦法處理數據庫中的其他條目,而不是基於其實際值?

+0

目標是將任意數量的行的文本字段連接起來,這些行形成一個line-> end_line-> line .. chain?或者只是成對連接? –

回答

0

好吧,我想通一些東西的作品。

如果任何人有任何更好,或更有效的...請讓我知道。

我的解決方案是創建一個臨時表,我加入到表:

 
CREATE TABLE update_index SELECT id, @row := @row + 1 as row FROM doc_lines, (SELECT @row := 0) AS r; 

然後我可以加入到該表,替代甚至然後刪除,然後奇然後刪除,然後重新創建臨時表和重複。

它的很多步驟,但它的作品。

我一定會對更優雅或高效的方法感興趣!