2011-12-23 89 views
0

我有兩個表sermons(sermon_id,preacher_id,sermon_name etc)preachers(preacher_id,firstname,lastname etc)。現在我展示這個像第一個牧師的名字,然後是這個牧師的所有佈道等,這是正常工作。但要顯示誰擁有的佈道宣講......問題與sql查詢

下面的代碼使用,但我只拿到了1號傳道..

function viewAllpreachers($offset=0, $limit=null) { 
     $preacher_ids = array(); 
     $this->db->distinct('preacher_id'); 
     $this->db->select('preacher_id'); 
     $this->db->from('sermons'); 

     $query = $this->db->get(); 

     if ($query->num_rows() > 0) { 

      foreach ($query->result() as $key => $res1) { 

       $preacher = array(); 
       $this->db->select('*'); 
       $this->db->from('preacher'); 
       $this->db->where('preacher_id', $res1->preacher_id); 
       $this->db->order_by('first_name'); 
       $query = $this->db->get('', $limit, $offset); 
       if ($query->num_rows() > 0) { 

        foreach ($query->result() as $row) { 
         $preacher[$row->preacher_id]['preacher_id'] = $row->preacher_id; 
         $preacher[$row->preacher_id]['preacher_name'] = $row->first_name . ' ' . $row->last_name; 
         $preacher[$row->preacher_id]['preacher_image'] = $row->preacher_image; 
         $preacher[$row->preacher_id]['preacher_bio_brief'] = $row->preacher_bio_brief; 

         $this->db->select('*'); 
         $this->db->from('sermons'); 
         $this->db->where('preacher_id', $row->preacher_id); 
         $this->db->order_by('sort_order '); 
         $sermon_array = array(); 

         $query = $this->db->get(); 
         if ($query->num_rows() > 0) { 
          foreach ($query->result() as $row1) { 
           $sermon_array[$row1->sermon_id] ['sermon_image'] = $row1->sermon_image; 
           $sermon_array[$row1->sermon_id] ['sermon_title'] = $row1->sermon_title; 
           $sermon_array[$row1->sermon_id] ['audio_file'] = $row1->audio_file; 
           $sermon_array[$row1->sermon_id] ['sermon_description'] = $row1->sermon_description; 
          } 
         } 
         $preacher[$row->preacher_id]['sermon'] = $sermon_array; 
        } 
        return $preacher; 
       } 
      } } 
     return false; 
    } 
+1

這豈不是簡單的內連接的情況下? – Anand 2011-12-23 09:02:46

+0

我想顯示所有佈道者的傳教士。如果傳教士沒有semons,就不會顯示他的細節 – Natasha 2011-12-23 09:03:19

+0

在你的代碼中,你有'return $ preacher;'這將返回並且在第一個'$ preacher'已經循環後離開函數。將所有傳道者保存在一個單獨的數組中,然後返回傳教者陣列。 – NoLifeKing 2011-12-23 09:03:23

回答

0
use this code 

$preacher = array(); 
       $this->db->select('*'); 
       $this->db->from('preacher'); 
       $this->db->join('preacher','sermons.preacher_id=preacher.preacher_id'); 
       $this->db->order_by('first_name'); 
       $query = $this->db->get('', $limit, $offset); 
       if ($query->num_rows() > 0) { 

        foreach ($query->result() as $row) { 
         $preacher[$row->preacher_id]['preacher_id'] = $row->preacher_id; 
         $preacher[$row->preacher_id]['preacher_name'] = $row->first_name . ' ' . $row->last_name; 
         $preacher[$row->preacher_id]['preacher_image'] = $row->preacher_image; 
         $preacher[$row->preacher_id]['preacher_bio_brief'] = $row->preacher_bio_brief; 

         $this->db->select('*'); 
         $this->db->from('sermons'); 
         $this->db->where('preacher_id', $row->preacher_id); 
         $this->db->order_by('sort_order '); 
         $sermon_array = array(); 

         $query = $this->db->get(); 
         if ($query->num_rows() > 0) { 
          foreach ($query->result() as $row1) { 
           $sermon_array[$row1->sermon_id] ['sermon_image'] = $row1->sermon_image; 
           $sermon_array[$row1->sermon_id] ['sermon_title'] = $row1->sermon_title; 
           $sermon_array[$row1->sermon_id] ['audio_file'] = $row1->audio_file; 
           $sermon_array[$row1->sermon_id] ['sermon_description'] = $row1->sermon_description; 
          } 
         } 
         $preacher[$row->preacher_id]['sermon'] = $sermon_array; 
        } 
        return $preacher; 

      } 
     return false; 
    } 
0

如果你想顯示與佈道的牧師,你應該添加一個JOIN到您的查詢,這樣,如果牧師沒有講道,它不會出現在結果行集中。

即:

function viewAllpreachers($offset=0, $limit=null) { 
     $preacher_ids = array(); 
     $this->db->distinct('preacher_id'); 
     $this->db->select('preacher_id'); 
     $this->db->from('sermons'); 

     $query = $this->db->get(); 

     if ($query->num_rows() > 0) { 

      foreach ($query->result() as $key => $res1) { 

       $preacher = array(); 
       $this->db->select('*'); 
       $this->db->from('preacher'); 
       $this->db->join('sermons', 'preacher.preacher_id = sermons.preacher_id'); 
       $this->db->where('preacher_id', $res1->preacher_id); 
       $this->db->order_by('first_name'); 
       $query = $this->db->get('', $limit, $offset); 
       if ($query->num_rows() > 0) { 

        foreach ($query->result() as $row) { 
         $preacher[$row->preacher_id]['preacher_id'] = $row->preacher_id; 
         $preacher[$row->preacher_id]['preacher_name'] = $row->first_name . ' ' . $row->last_name; 
         $preacher[$row->preacher_id]['preacher_image'] = $row->preacher_image; 
         $preacher[$row->preacher_id]['preacher_bio_brief'] = $row->preacher_bio_brief; 

         $this->db->select('*'); 
         $this->db->from('sermons'); 
         $this->db->where('preacher_id', $row->preacher_id); 
         $this->db->order_by('sort_order '); 
         $sermon_array = array(); 

         $query = $this->db->get(); 
         if ($query->num_rows() > 0) { 
          foreach ($query->result() as $row1) { 
           $sermon_array[$row1->sermon_id] ['sermon_image'] = $row1->sermon_image; 
           $sermon_array[$row1->sermon_id] ['sermon_title'] = $row1->sermon_title; 
           $sermon_array[$row1->sermon_id] ['audio_file'] = $row1->audio_file; 
           $sermon_array[$row1->sermon_id] ['sermon_description'] = $row1->sermon_description; 
          } 
         } 
         $preacher[$row->preacher_id]['sermon'] = $sermon_array; 
        } 
        return $preacher; 
       } 
      } } 
     return false; 
    } 

注:有沒有你爲什麼要使用兩個查詢,而不是隻有一個特定的原因,你應該能夠檢索具有在一個SQL查詢中的佈道宣講的列表。

function viewAllpreachers($offset=0, $limit=null) { 
    $preacher = array(); 
    $this->db->select('*'); 
    $this->db->from('preacher'); 
    $this->db->join('sermons', 'preacher.preacher_id = sermons.preacher_id'); 
    $this->db->where('preacher_id', $res1->preacher_id); 
    $this->db->order_by('first_name'); 

    $query = $this->db->get('', $limit, $offset); 



    if ($query->num_rows() > 0) { 

     foreach ($query->result() as $row) { 
      $preacher[$row->preacher_id]['preacher_id'] = $row->preacher_id; 
      $preacher[$row->preacher_id]['preacher_name'] = $row->first_name . ' ' . $row->last_name; 
      $preacher[$row->preacher_id]['preacher_image'] = $row->preacher_image; 
      $preacher[$row->preacher_id]['preacher_bio_brief'] = $row->preacher_bio_brief; 

      $this->db->select('*'); 
      $this->db->from('sermons'); 
      $this->db->where('preacher_id', $row->preacher_id); 
      $this->db->order_by('sort_order'); 
      $sermon_array = array(); 

      $query = $this->db->get(); 
      if ($query->num_rows() > 0) { 
       foreach ($query->result() as $row1) { 
        $sermon_array[$row1->sermon_id] ['sermon_image'] = $row1->sermon_image; 
        $sermon_array[$row1->sermon_id] ['sermon_title'] = $row1->sermon_title; 
        $sermon_array[$row1->sermon_id] ['audio_file'] = $row1->audio_file; 
        $sermon_array[$row1->sermon_id] ['sermon_description'] = $row1->sermon_description; 
       } 
      } 
      $preacher[$row->preacher_id]['sermon'] = $sermon_array; 
     } 
     return $preacher; 
    } 

    return false; 
} 
0

我會在修復代碼的地方添加註釋。

function viewAllpreachers($offset=0, $limit=null) 
{ 
    $preacher_ids = array(); 
    $this->db->distinct('preacher_id'); 
    $this->db->select('preacher_id'); 
    $this->db->from('sermons'); 

    $query = $this->db->get(); 
    $preachers = array(); 
    if ($query->num_rows() > 0) 
    { 

     foreach ($query->result() as $key => $res1) 
     { 
      $preacher = array(); 
      $this->db->select('*'); 
      $this->db->from('preacher'); 
      $this->db->where('preacher_id', $res1->preacher_id); 
      $this->db->order_by('first_name'); 
      $query = $this->db->get('', $limit, $offset); 
      if ($query->num_rows() > 0) 
      { 
       foreach ($query->result() as $row) 
       { 
        $preacher[$row->preacher_id]['preacher_id'] = $row->preacher_id; 
        $preacher[$row->preacher_id]['preacher_name'] = $row->first_name . ' ' . $row->last_name; 
        $preacher[$row->preacher_id]['preacher_image'] = $row->preacher_image; 
        $preacher[$row->preacher_id]['preacher_bio_brief'] = $row->preacher_bio_brief; 

        $this->db->select('*'); 
        $this->db->from('sermons'); 
        $this->db->where('preacher_id', $row->preacher_id); 
        $this->db->order_by('sort_order '); 
        $sermon_array = array(); 

        $query = $this->db->get(); 
        if ($query->num_rows() > 0) 
        { 
         foreach ($query->result() as $row1) 
         { 
          $sermon_array[$row1->sermon_id] ['sermon_image'] = $row1->sermon_image; 
          $sermon_array[$row1->sermon_id] ['sermon_title'] = $row1->sermon_title; 
          $sermon_array[$row1->sermon_id] ['audio_file'] = $row1->audio_file; 
          $sermon_array[$row1->sermon_id] ['sermon_description'] = $row1->sermon_description; 
         } 
         $preacher[$row->preacher_id]['sermon'] = $sermon_array; 
         $preachers[] = $preacher; 
         // I moved this code, so it will only add preachers who have sermons. 
        } 

       } 
       //return $preacher; 
       // If you return here, it'll always return the first preacher. 
      } 
     } 
     return $preachers; 
     // Here we return all preachers, that are added 
    } 
    return false; 
}