我在MySQLMySQL的插入,如果不更新
wi_indv_training(trn_id,ind_id,is_deleted)
wi_trn_org(trn_id,grp_id,is_deleted)
wi_indv_org(ind_id,grp_id,is_deleted)
這裏三個表,多組可以被分配到由wi_trn_org表處理的培訓。 多個人可以分配到多個組。許多個人都參與培訓。在這裏,我們提供的個人已經與團體相關聯。 現在在插入一個組進行訓練時,該組中的個人必須與訓練相關聯。在給定的訓練中可能已經有is_deleted = yes標記的組和個人(部分或全部)。
現在,在插入時,我想用is_deleted = no標記已刪除的組和個人,如果數據已經存在於相應的表中,則應該將數據作爲新數據插入。爲此,我實施了以下性能非常緩慢的方法;
foreach ($grp_id as $key => $value) {
# code...
$rs=$this->db->pdoQuery("SELECT * FROM wi_trn_org
WHERE trn_id='$trn_id'
AND grp_id='$value'")->results();
if(count($rs)>0)
{
$this->db->pdoQuery("UPDATE wi_trn_org SET is_deleted=0
WHERE trn_id='$trn_id' AND grp_id='$value'");
$grp_indv=$this->db->pdoQuery("SELECT ind_id
FROM wi_indv_org
WHERE grp_id='$value'
AND is_deleted=0")->results();
foreach ($grp_indv as $ke => $va)
{
$ind_id=$va['ind_id'];
$rows=$this->db->pdoQuery("SELECT * FROM wi_indv_training
WHERE trn_id='$trn_id'
AND ind_id='$ind_id'")->results();
if(count($rows)>0)
{
$this->db->pdoQuery("UPDATE wi_indv_training
SET is_deleted=0,indv_source='Group'
WHERE trn_id='$trn_id'
AND ind_id='$ind_id'");
}
else
{
$this->db->insert("wi_indv_training",
array("ind_id"=>$ind_id,
"indv_source"=>'Group',
"trn_id"=>$trn_id,
"attendance"=>"yes",
"active"=>"yes"));
}
}
}
else
{
$this->db->insert("wi_trn_org",array('trn_id'=>$trn_id,'grp_id'=>$value));
$grp_indv=$this->db->pdoQuery("SELECT ind_id
FROM wi_indv_org
WHERE grp_id='$value'
AND is_deleted=0")->results();
foreach ($grp_indv as $ke => $va)
{
$ind_id=$va['ind_id'];
$rows=$this->db->pdoQuery("SELECT *
FROM wi_indv_training
WHERE trn_id='$trn_id'
AND ind_id='$ind_id'")->results();
if(count($rows)>0)
{
$this->db->pdoQuery("UPDATE wi_indv_training
SET is_deleted=0,
indv_source='Group'
WHERE trn_id='$trn_id'
AND ind_id='$ind_id'");
}
else
{
$this->db->insert("wi_indv_training",
array("ind_id"=>$ind_id,
"indv_source"=>'Group',
"trn_id"=>$trn_id,
"attendance"=>"yes",
"active"=>"yes"));
}
}
}
}
任何人都可以幫助關於性能增強的最佳算法?
能否請您詳細說明一下例子。我嘗試使用INSERT INTO ... ON DUPLICATE KEY UPDATE。但我無法得到結果。 – 2014-09-01 05:33:58
你做了我建議的重試:試圖讓第一個SQL SELECT語句退出循環?那工作?這將比嘗試解決整個事情更簡單 - 取決於您的數據庫大小,這可能就足夠了。 – JasonS 2014-09-01 12:13:33
這減少了Loop中多個SELECT查詢的開銷,從而減少了時滯。 – 2014-09-02 04:21:18