좋아, 일부 논리를 기반으로 항목을 결합하여 생성하려고하는 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 개 호선 일치 라인 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에서 회전을 끝내더라도 어떤 점에서는 결국 겹치는 것처럼 보입니다.
아이디어가 있으십니까? 실제 값을 기반으로하지 않고 데이터베이스의 모든 항목을 처리하는 방법이 있습니까?
라인 -> end_line-> line ... chain을 구성하는 모든 행의 텍스트 필드를 연결하는 것이 목표입니까? 아니면 그냥 pairwise 연결? –