2012-12-01 38 views
1

如何在現有行中存在空字段的情況下合併行與現有行而不是插入行?在MySQL中合併的另一行[+ php?]

這裏是一個例子。現有行:

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

行插入:

id f1 f2 f3 f4 ... 
NULL  d 

所需結果:

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

我做了這個一個PHP函數,每個字段和更新其SELECTS空行數據在這一行,但這太慢了。有什麼方法可以改進和加速這段代碼嗎?

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

你可以用什麼一般稱爲「UPSERT」實現這一點 - 在MySQL中,你可以與"INSERT..ON DUPLICATE KEY UPDATE"語法

+0

對不起,但插入不是一種選擇,因爲這張表的唯一關鍵是id,而且我還不知道表格網格中是否有任何「空白點」來插入字段數據。或者你的意思是不同的? – Goover

+0

它應該工作,因爲它出現在您的php代碼示例中,您知道該id,並且可以將其包含在插入中。如果你不知道,那麼你怎麼知道你在哪一行合併? – GreyBeardedGeek

+0

我的意思是我在執行此代碼之前不知道該ID。嗯,是的,在選擇我知道id和是後,似乎有可能用類似INSERT INTO g_ul_cond_orders(id,f1,f2)VALUES(found_id,f1_val,f2_val)之類的東西插入行。DUPLICATE KEY UPDATE SET f1 = VALUES(f1)...',但我不認爲這會比我的代碼更快.. – Goover