ОК, это заняло определенную работу, и мне также пришлось внести некоторые коррективы, на мой взгляд
Таким образом, проблему можно разбить на два основных компонента
1) Передать результаты первого запроса в виде массива второму, используя where_in
2) Переупорядочить / перегруппировать результаты первого массива на item_id
Мой предыдущий код выполнял второй компонент неявно
Итак, вот что я сделал (ограничения, смещения, упорядочение были вырезаны для улучшения читабельности)
function get_item_history($id)
{
//from metadata_history get item_id and corresponding metadata
$this->db->from('metadata_history')->where(array('id'=>$id, 'current_revision'=> "TRUE"));
$query = $this->db->get();
$result_query1 = $query->result_array(); //store this in an array
foreach ($result_query1 as $key-> $row){
$result[$row['item_id']]['meta_info'] = $row; //the first query contains meta info, that must be passed to the view
$selected_id_array[] = $row['item_id']; //Create a array to pass on to the next query
$result[$row['item_id']]['items'] = array(); //declare an array which will hold the results of second query later
}
$this->db->select('h.*');
$this->db->from('history h');
$this->db->where_in('h.item_id', $selected_id_array);
$this->db->where(array('h.current_revision' => 'TRUE'));
$query = $this->db->get();
$row = $query->result_array();
foreach ($row as $key => $datarow) {
$result[$datarow['item_id']]['items'][] = $datarow; //populate the array we declared earlier with results from second query
}
return $result; // Now this variable holds an array which is indexed by item id and contains the results of second query 'grouped' by item_id
}
Таким образом, количество запросов было сокращено с ~ 10 до 2.
На моей локальной машине это экономит ~ 50 мсек / страницу, хотя я не уверен, как это будет работать для больших баз данных.