How to reduce the number of queries required to get this result

piratamorgan

New Member
I'm writing an application on top of CodeIgniter to better organize my ebook collection. I'm nearly done, but I realize my 'browse' page is running far too many queries - two per book - to get their information. Obviously not at all ideal, especially since I have about 1000 books to put into this system.I currently have one model function which gets all of the books (will eventually be modified to take parameters - that's the next step) and another that gets the meta information for each returned book. The second function is the one which makes two queries for each book - one to get the information in the book table and another to get the tags associated with the book. Here are the two model functions:Get the list of books:\[code\]function get_books() { $this->db->select('isbn')->order_by('title'); $query = $this->db->get('books'); $result = $query->result(); return $result;}\[/code\]Get the book meta information:\[code\]function get_book_info($isbn) { // Grab the book from Amazon $amazon = $this->amazon->get_amazon_item($isbn); // Get the book info $this->db->select('title, publisher, date, thumb, filename, pages'); $query = $this->db->get_where('books', array('isbn' => $isbn)); $bookResult = $query->row(); // Get the book's tags $this->db->select('tag'); $this->db->from('tags AS t'); $this->db->join('books_tags AS bt', 'bt.tag_id = t.id', 'left'); $this->db->where('bt.book_id', $isbn); $this->db->order_by('t.tag'); $tagQuery = $this->db->get(); foreach ($tagQuery->result() as $row) { $tagResult[] = $row->tag; } $tagResult = implode(', ', $tagResult); // Send data $data = http://stackoverflow.com/questions/3823473/array('isbn' => $isbn, 'thumb' => $bookResult->thumb, 'title' => strip_slashes($bookResult->title), 'file' => $bookResult->filename, 'publisher' => strip_slashes($bookResult->publisher), 'date' => date('F j, Y', strtotime($bookResult->date)), 'pages' => $bookResult->pages, 'tags' => $tagResult, 'rating' => $amazon->Items->Item->CustomerReviews->AverageRating, 'raters' => $amazon->Items->Item->CustomerReviews->TotalReviews ); return $data;}\[/code\]I'm certain there's a way to write one or two queries that will gather all the records into objects I can then filter through, rather than having to write two queries for each one, but I have no idea where to even start trying to write that. Any suggestions are welcome. Thanks much,Marcus
 
Back
Top