2012-12-01 7 views
1

행을 삽입하는 대신 기존 행에 빈 필드가있는 경우 어떻게 병합 할 수 있습니까?MySQL에서 병합하는 다른 행

여기 예입니다. 기존 행 :

id f1 f2 f3 f4 ... 
0  a   b  
1  c     

행 삽입 :

id f1 f2 f3 f4 ... 
NULL  d 

필요한 결과 : 나는 이것에 대한 PHP 함수, ​​각 필드와 업데이트 SELECTS 빈 행했습니다

id f1 f2 f3 f4 ... 
0  a  d  b  
1  c 

을 이 행의 데이터는 너무 느립니다. 이 코드를 개선하고 속도를 향상시킬 수있는 방법이 있습니까? 당신은 "upsert"로 일반적으로 알려진 것과이를 달성 할 수

foreach($cond as $cond_name = > $cond_value) { 
    if ($cond_value != '') { 
     $cond_count++; 
     $q = 'SELECT `id` FROM `g_ul_cond_orders` WHERE `ul_id`='.$ul_id.' AND `'.$cond_name.'`="" LIMIT 1;'; 
     $r = mysql_query($q); 
     if ($r) { 
      if ($row = mysql_fetch_assoc($r)) { 
       $q = 'UPDATE `g_ul_cond_orders` SET `'.$cond_name.'`="'.$cond_value.'" WHERE `id`='.$row['id'].';'; 
       $r = mysql_query($q); 
       if ($r) { 
        $cond[$cond_name] = ''; 
        $cond_count--; 
       } 
      } 
     } 
    } 
} 

답변

3

을 함께 할 수

UPDATE `g_ul_cond_orders` SET `'.$cond_name.'`="'.$cond_value.'" WHERE `id`= (SELECT `id` FROM `g_ul_cond_orders` WHERE `ul_id`='.$ul_id.' AND `'.$cond_name.'`="" LIMIT 1); 

이 쿼리를 사용하면 코드의 두 번째 쿼리와 결과가 필요하지 않습니다.

+0

아, 간단합니다. 그것에 대해 생각하지 않았습니다. 고맙습니다. 이 경우 데이터가 한 번만 전송되기 때문에 시간이 줄어 듭니다. SELECT가 빈 결과를 반환하면 테이블을 업데이트하지 않습니다. 지금 가장 좋은 거래 – Goover

+0

네, 거의 8 배 빠릅니다. 그냥 확인해 봤어. – Goover

+0

하하 .. 작동하지 않기 때문에 너무 빠릅니다. 미안하지만 의도 한 테스트를하지 않았으므로 쿼리에 오류가 있습니다. – Goover

0

- MySQL의에서 당신은 적어도 당신이 업데이트에 대한 하나 개의 쿼리를 사용할 수있는 "INSERT..ON DUPLICATE KEY UPDATE" 구문

+0

미안하지만이 테이블의 유일한 키는 id이기 때문에 upserting은 옵션이 아니며 필드 데이터를 삽입하기위한 테이블 그리드에 "빈 공간"이 있는지 아직 알지 못합니다. 아니면 뭔가 다른 것을 의미합니까? – Goover

+0

PHP 코드 샘플에 나타나는 것처럼 ID를 알고 삽입에 포함시킬 수 있으면 작동합니다. 당신이 그것을 모르는 경우, 어떤 경우에 병합 할 행을 어떻게 알 수 있습니까? – GreyBeardedGeek

+0

나는이 코드를 실행하기 전에 ID를 모른다. 예, ID를 알고 선택했다면,'INSERT INTO g_ul_cond_orders (id, f1, f2) VALUES (found_id, f1_val, f2_val)와 같은 행을 업서 트할 수 있습니다. 중복 키 업데이트 SET f1 = VALUES (f1) ...',하지만 내 코드보다 빠를 것이라고 생각하지 않습니다. – Goover

관련 문제