Вставьте пакет php mysql с проверкой дубликата и суммируйте значения поля дубликата - PullRequest
0 голосов
/ 28 февраля 2019

У меня есть 1 миллион данных, использующих foreach.ex table: table

data data Я хочу вставить эти данные, используя пакетную / множественную вставку, но у меня возникла проблема, когда я получил повторяющиеся данные.если данные дублируются, я хочу, чтобы сумма поля суммировалась и обновляла поле суммы дублирующими данными суммы.

это мой код до

<?php
foreach ($data_transaksi as $key)
      {
          if($key['STATUS_COA'] != $key['CHART_OF_ACCOUNT_STATUS'])
          {
              if($key['ACCOUNT_CATEGORY_CODE'] == '9')
              {
                  $amount = round($key['AMOUNT'],2);
              }
              else
              {
                  $amount = round($key['AMOUNT'],2) *-1;
              }
          }
          else
          {
              if($key['ACCOUNT_CATEGORY_CODE'] == '9')
              {
                  $amount = round($key['AMOUNT'],2)*-1;
              }
              else
              {
                  $amount = round($key['AMOUNT'],2);
              }
          }

          
          $dt_exsis = $this->ledger_model->cek_data_coa_exsis($key['COA_CODE'],$modul,$ID_USER);
          if(empty($dt_exsis['id']))
          {
              //TRYINSERTINGBATCH
              // $datainsert[] = '('.$key['COA_CODE'].','.$amount.','.$ID_USER.',"'.$modul.'")';
              // $test = $key['COA_CODE'];

              $datainput = array(
                      'COA_CODE' => $key['COA_CODE'],
                      'AMOUNT' => $amount,
                      'MODUL' => $modul,
                      'USER_ID' => $ID_USER
                      );
                      
              $this->ledger_model->save_rows_to_table($datainput,'finance_lapkue_temp');
          }
          else
          {
              $amount_fix = $amount + $dt_exsis['AMOUNT'];
              $data=array(
                'AMOUNT' => $amount_fix
              );
              $this->ledger_model->edit_rows_to_table_where($data,'finance_lapkue_temp','id',$dt_exsis['id']);
              // $q = "UPDATE finance_lapkue_temp set AMOUNT = '$amount_fix' where id = '".$dt_exsis['id']."'";
              // $this->db->query($q);
          }
          // $data_amount[$key['COA_CODE']] += $amount;
      }
     ?>

Если я использую этот код, процесс будет таким медленным

1 Ответ

0 голосов
/ 28 февраля 2019

Хорошая опция будет передавать только те данные в БД, которые вы хотите вставить.Все задачи по очистке данных могут быть выполнены в контроллере.

// Create a data array and add all info
$data = [];
//if user does not exist add it in array
if (empty($dt_exist($id))) {
  $data[$ID_USER] = array(
                  'COA_CODE' => $key['COA_CODE'],
                  'AMOUNT' => $amount,
                  'MODUL' => $modul,
                  'USER_ID' => $ID_USER
                  );
}
else {
      //if user exist in $data just modify the amount
      if (!empty($data[$ID_USER])) {
        $data[$ID_USER]['AMOUNT'] += $dt_exsis['AMOUNT']; 
     }
      else {
        // if user does not exist in data create add all info
        $data[$dt_exsis['ID_USER']] = array(
                  'COA_CODE' => $dt_exsis['COA_CODE'],
                  'AMOUNT' => $dt_exsis['amount'],
                  'MODUL' => $dt_exsis['modul'],
                  'USER_ID' => $dt_exsis['ID_USER']
                  );
    }
}

Это сохранит несколько вызовов в БД, и в конце вы можете передать $ data и выполнить несколько вставок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...