2011-12-23 3 views
0

У меня есть две таблицы sermons(sermon_id,preacher_id,sermon_name etc) и preachers(preacher_id,firstname,lastname etc). Теперь я показываю это как первое имя проповедника, а затем все проповеди этого проповедника и так далее, это работает правильно. Но хочет, чтобы отобразить проповедник, которые имеют проповеди ...Проблема с sql-запросом

используется следующий код, но я получил только первый проповедник ..

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

+0

Я хочу показать всех проповедников, у которых есть проповеди. если у проповедника нет семен, он не будет отображать свои данные. – Natasha

+0

В вашем коде у вас есть 'return $ preacher;', который вернет и покинет функцию после того, как первый 'preacher' будет зациклен. Сохраните все проповедники в отдельном массиве, а затем верните массив проповедников. – NoLifeKing

ответ

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; 
} 
Смежные вопросы