2012-02-09 33 views
1

我需要显示最受欢迎的类别,这意味着课程最多的类别。我有一个databasase架构,其中包括:如何获得最受欢迎的类别?

tbl_categories:id, name ; tbl_category_courses: cat_id, course_id ; tbl_courses: id,name,description 

我的逻辑是这样的,先得到所有的类别和之后的foreach类别计算所有的课程。

$query = $this->db->select('*') 
         ->from('categories') 
         ->limit($limit) 
         ->get(); 

    $data = array(); 

    if ($query->num_rows() > 0) 
    { 
     foreach ($query->result() as $row) 
     { 
      $nr_of_courses = $this->db->select('*') 
             ->from('course_categories') 
             ->where('course_categories.category_id', $row->id) 
             ->join('courses', 'courses.id=course_categories.course_id') 
             ->count_all_results(); 

      $row->course_number = $nr_of_courses; 
      $data[] = $row; 
     } 
    } 

这是我的代码到现在为止,所有我可以检索的类别有多少课程,每个人都有,但我不能过滤。我需要显示前10名。 有人可以提供一些指导和帮助。我也知道在foreach循环中计数查询是不好的设计,我怎么能改进这个代码,因为我需要在主应用程序页面上使用它,它需要顺利运行。

+0

你试过把极限放在上面吗? – tomexsans 2012-02-09 16:14:38

+0

限制在哪里?我真的不需要限制,我需要排序的结果与最$ nr_of_courses的类别,我认为...我不认为这只能从sql实现...或者如果它可以请别人共享 – Mythriel 2012-02-09 16:20:59

回答

0

如果你想这样做的SQL,这取决于你的实际的数据库类型:

select top 10 
    cat.name, 
    count(distinct course_id) as cnt 
from 
    course_categories cc 
join 
    categories cat 
    on cat.cat_id=cc.cat_id 
group by 
    cat.name 
order by 
count(distinct cc.course_id) desc 

我不够用(我假设),LINQ,熟悉使用这种格式来写。 我希望有所帮助。