好的,我有一个我正在尝试生成的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上旋转奇数和偶数,但在某些时候似乎最终会出现重叠。
有什么想法吗?有没有办法处理数据库中的每个其他条目,而不是基于它的实际值?
答案 0 :(得分:0)
如果有人有更好的或更有效的......请告诉我。
我的解决方案是创建一个临时表,我将其加入表a:
CREATE TABLE update_index SELECT id, @row := @row + 1 as row FROM doc_lines, (SELECT @row := 0) AS r;
然后我可以加入到该表中,甚至然后删除,然后奇数然后删除,然后重新创建临时表并重复。
它有很多步骤,但它确实有效。
我肯定对更优雅或更有效的方法感兴趣!