2012-09-12 59 views
1

我在我的數據庫中有5個表。他們的minimalized版本是這樣的:通過多種功能獲取數據庫的記錄

+------------+ +--------------+ +---------------+ +-------------+ +-------------+ 
| Blog | |  Feed  | | Category | | SubCategory | | Blog_Subcat | 
+------------+ +--------------+ +---------------+ +-------------+ +-------------+ 
| blog_id | | feed_id  | | category_id | | subcat_id | | blog_id  | 
| blog_title | | blog_id  | | category_name | | subcat_name | | subcat_id | 
| blog_blog | | feed_content | +---------------+ | category_id | +-------------+ 
+------------+ +--------------+     +-------------+ 

差不多,一個博客可以是1和或多個子類別的一部分。 一個子類別只能是一個類別的一部分。

我想顯示與特定類別相對應的博客的提要。 我有一些URL形式:http://www.example.com/category_name

我所做的是:

我得到category_name。我在類別表中搜索category_id。
我在子類別表中查找所有具有該category_id的子類別。

然後,我在blog_id WHERE category_id IN(子類別的數組)中創建了一個查詢,它將Feed和Blog_Subcat表連接起來。

之後,我得到了那個類別中的所有Feed。

現在正在工作,但我的表格僅在一個月內就有大約30,000個Feed,所以我覺得這個過程有點慢。

我最後的查詢如下所示:

public static function findLastPosts($subcategories=false){ 
    $table = new self; 

    $query = $table->select()->setIntegrityCheck(false); 
    $query->from('feeds', array('feeds.blog_id', 'feeds.feed_id', 'feeds.feed_content'));  
    $query->join(
     'blog_subcat', 
     'blog_subcat.blog_id = feeds.blog_id', 
     array('blog_subcat.blog_id') 
    ); 

    $query->where('blog_subcat.category IN (?)', $subcategories);   
    $query->where('feeds.date_created <= NOW()');    
    $query->order('ati_feeds.date_created DESC'); 
    //rest of my code... 
} 

我使用Zend框架爲這個項目。我想知道:如果有更好的方法來獲取Feed,因爲某些類別需要一些時間來加載太長時間?

回答

0

試試這個:

$columns = array(
    // whatever columns you ultimately want to select in this array 
    // example: 'title' => 'blogs.title' queries 'blogs.title AS title' 
); 
$select = $db->select(); // where $db is your Zend_Db_Adapter instance 
$select -> from('feeds as f',$columns); 
$select -> join('blogs as b','b.id = f.blog_id',array()); 
$select -> join('blog_subcat as bs','bs.blog_id = f.blog_id',array()); 
$select -> join('subcategories as s','s.id = bs.subcat_id',array()); 
$select -> join('categories as c','c.id = s.cat_id',array()); 
$select -> where('c.name = ?',$categoryName); 
$select -> order('f.date_created DESC'); 
$select -> group('f.id'); 
$select -> limit($count,$pageNumber - 1); 
$results = $db->fetchAll($select); 
// and then whatever you do to populate view models 

我認爲有一個查詢數據庫可以優化性能將比多個查詢更好地拼湊同樣的事情。特別是如果你使用遠程MySQL服務器...

+0

嗨!我試過了,它仍然很慢,有沒有其他方法?我也列了索引。謝謝! – raygo