sql >> データベース >  >> RDS >> Mysql

ジャンクションテーブルを新しい値で更新します

    これは古いことは知っていますが、答えを見つけるのに時間がかかり、この質問はグーグルで上位にランクされています。

    次のコードを見つけて変更しました:

    INSERT IGNORE INTO my_table VALUES (1,1), (1,2), (1,3);
    
    DELETE FROM my_table WHERE c1 NOT IN (1,2,3) AND my_table = 1;
    

    ソースコードの出所: http://borzacchiello.it/how-to -update-a-junction-table /



    PHP変数とPDOループで使用するために変更したコード:

        $a_id = $my_main_id //this would be c1 in the above question
    
        //Set Variable From Post
        $var_1 = isset($_POST['var_1']) ? $_POST['var_1'] : '';
        $var_2 = isset($_POST['var_2']) ? $_POST['var_2'] : '';
        //etc, etc, etc
    
        //put variables into array
        $data = array('var_1'=>$var_1, 'var_2'=>$var_2, 'var_3'=>$var_3, 'var_4'=>$var_4, 'tarp_5'=>$tarp_5);
    
                           //get count of variable that contain data and not empty
                           $data_array_count = 0;
                           foreach ($data as $column => $value) {     
                                    if($value != '') {
                                        $data_array_count = ++$data_array_count;
                                    }
                           }
    
                           //if contains atleast one variable run update code     
                           if($data_array_count != 0) {
    
                                //loops through and inserts each varible in array
                                foreach ($data as $column => $value) {
    
                                    //ignores variables without any data
                                    if($value != '') {  
                                        $insert = $db->prepare("INSERT IGNORE my_table (a_id, b_id) VALUES (:a_id, :b_id)"); 
                                        $insert->execute(array(':a_id' => $a_id,
                                                               ':b_id' => $value ));        
                                    }
                                }
    
    
                                    //sets up variables in array to remove any records that need to be deleted
                                    $columns = "";  
                                    $holders = "";  
                                    foreach ($data as $column => $value) {     
                                        if($value != '') {      
                                           $columns .= ($columns == "") ? "" : ", ";  
                                           $columns .= $column;  
                                           $holders .= ($holders == "") ? "" : ", ";  
                                           $holders .= ":$column";  
                                        }
                                    }
    
    
                                    $delete = $db->prepare("DELETE FROM my_table WHERE accessory_id NOT IN ($holders) AND (carrier_id = :a_id)"); 
    
                                //bind value for main id     
                                $delete->bindValue(":a_id", $a_id);
    
                                //loop to bind value for each variable stored in array with data
                                foreach($data as $placeholder => $value) {
                                    if($value != '') {
                                   $delete->bindValue(":" . $placeholder, $value);
                                    }
                                }
    
                                $delete->execute();      
    
                        } 
    


    元の質問の例を使用すると、c1ごとにこのコードを実行する必要があります。 更新したいID番号(c1 $a_idと同等になります 私の例では変数です。




    1. MySQLで.csvアップロードの進行状況を確認する方法

    2. Railsマルチテナントアーキテクチャ、複数のテナントへのアクセスの範囲

    3. 2つのテーブルを比較して、合計顧客の最大数を表示する必要があります

    4. 関数から返されたテーブルから個々の列を取得するにはどうすればよいですか?