1

既存の行に空のフィールドがある場合、行を挿入する代わりに既存の行とマージするにはどうすればよいですか?

ここに例があります。既存の行:

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--;
                }
            }
        }
    }
}
4

2 に答える 2

3

少なくとも、更新には1つのクエリを使用できます

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);

このクエリでは、2番目のクエリと結果のコードは必要ありません。

于 2012-12-01T00:55:41.303 に答える
0

これは、一般的に「アップサート」と呼ばれるもので実現できます。mySQLでは、「INSERT..ONDUPLICATEKEYUPDATE」構文で実現できます。

于 2012-12-01T00:40:54.013 に答える