2011-11-25 2 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 개 호선 일치 라인 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

라인 -> end_line-> line ... chain을 구성하는 모든 행의 텍스트 필드를 연결하는 것이 목표입니까? 아니면 그냥 pairwise 연결? –

답변

0

좋아요, 나는 그게 효과가 있다고 생각했습니다.

누구든지 더 좋거나 더 효율적인 것이 있다면 ... 알려주세요.

내 솔루션은 내가 표 A에 가입 임시 테이블을 만드는 것이 었습니다 :

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

내가 그 테이블에 가입 할 수 있습니다가, 대체도 다음 다음 다음 홀수 삭제, 삭제를 한 후 임시을 다시 테이블과 반복.

많은 단계가 있지만 작동합니다.

나는 더 우아하고 효율적인 방법에 관심이있을 것입니다.

관련 문제