2016-01-22 3 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 и данные othere, но она будет работать следующим образом.

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

Смежные вопросы