MySql - SQL - 如何避免单个查询中的重复更新

时间:2011-11-25 19:14:12

标签: mysql sql

好的,我有一个我正在尝试生成的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');

当一行中的两行符合某个条件时,我正在尝试合并“text”的值。

e.g。我现有的查询类似于以下内容:

end_line

然后我跟着它:

  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.type, b.text="DELETE", a.text=CONCAT(a.text, " ", TRIM(b.text))
  WHERE b.end_line REGEXP '^[a-z]$';

我遇到的问题是第1行与第2行匹配,第2行将第2行标记为删除.... 第2行匹配第3行,第3行标记为删除... 第3行匹配第4行,标记第4行,用于删除... 等

结果我最终删除了比我想要的更多的行。

起初我以为我可以这样做,让它跳过其他所有行:

   DELETE from doc_lines WHERE '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.type, b.text="DELETE", a.text=CONCAT(a.text, " ", TRIM(b.text))
  WHERE b.type REGEXP '^[a-z]$' AND a.end_line <> "DELETE";

这个问题我需要多次运行查询,因为最终我想要1-6行和7-8行(使用我的例子)。每次后续调用都会将线条与线条后面的线条进行组合。

这个问题是最终我最终遇到与原始查询相同的情况,并且我标记了一些删除行,也用于标记其他行以进行删除。

即使我最终在行,id或end_line上旋转奇数和偶数,但在某些时候似乎最终会出现重叠。

有什么想法吗?有没有办法处理数据库中的每个其他条目,而不是基于它的实际值?

1 个答案:

答案 0 :(得分:0)

好吧,我想出了一些有用的东西。

如果有人有更好的或更有效的......请告诉我。

我的解决方案是创建一个临时表,我将其加入表a:

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

然后我可以加入到该表中,甚至然后删除,然后奇数然后删除,然后重新创建临时表并重复。

它有很多步骤,但它确实有效。

我肯定对更优雅或更有效的方法感兴趣!