2016-01-22 52 views
0

有許多sql請求的循環。 但我只需要一個請求。如何將這些請求合併到PostgreSQL中?

foreach($ids as $id){ 
     $oldId = ExecSQL_SelectOne("SELECT point_ref FROM {$this->model->MainTable} WHERE id =".$id); 
     ExecSQL_NoSelect("INSERT INTO history (id, c_type, employee_ref, object_name, object_ref, c_data, c_timestamp) VALUES (nextval 
     ('history_id_seq'), 'upd', ".$_SESSION['emp_id'].",'".$this->MC."','".$id."', '{\"Popup1\":{\"point_ref\":\"$oldId\"}}', '".date('d.m.Y H:i:s')."')"); 
    } 

謝謝!

回答

0

試試這個:

WITH pointArr as (SELECT point_ref FROM {$this->model->MainTable} 
WHERE id = $id) RETURNING point_reff 
INSERT INTO history (id, c_type, employee_ref, object_name, 
object_ref, c_data, c_timestamp) 
VALUES (nextval ('history_id_seq'), 'upd', ".$_SESSION['emp_id'].",'". 
$this->MC."','".$id."', '{\"Popup1\":{\"point_ref\":\" 
(SELECT point_reff FROM pointArr)\"}}', '".date('d.m.Y H:i:s')."')"); 

注:未驗證的控制檯。它可能是語法問題,因爲你正在使用一些PHP變量和其他數據,但它會像這樣工作。

0

你並不需要使用PHP對於聲明中,這可能是這麼慢,它就像一個更好的辦法:

$all_ids = implode('),(', $ids); // PHP CODE 

$sql = "INSERT INTO history (id, c_type, employee_ref, 
object_name, object_ref, c_data, c_timestamp) 
SELECT nextval('history_id_seq'), 'upd', ".$_SESSION['emp_id'].", 
'".$this->MC."', ids.column1, '{\"Popup1\":{\"point_ref\": main.point_ref }}', 
'".date('d.m.Y H:i:s')."') 
FROM (VALUES (".$all_ids.")) as ids 
LEFT JOIN {".$this->model->MainTable."} main ON ids.column1 = main.id "; 

ExecSQL_NoSelect($sql); 

其次,你應該使用準備的SQL語句,避免CONCAT SQL代碼安全原因 Check this :)