2012-09-12 35 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