2012-02-09 34 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,熟悉使用這種格式來寫。 我希望有所幫助。