Проблема с SQL-запросом - PullRequest
       2

Проблема с SQL-запросом

0 голосов
/ 23 декабря 2011

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

используется следующий код, но я получил только 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;
    }

Ответы [ 3 ]

0 голосов
/ 23 декабря 2011

Я добавлю комментарии, где я исправлю код.

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;
}
0 голосов
/ 23 декабря 2011
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 голосов
/ 23 декабря 2011

Если вы хотите отобразить проповедника с проповедью, вы должны добавить 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...