2011-12-23 101 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; 
}