问题与sql查询
问题描述:
我有两个表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;
}
答
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;
}
答
如果你想显示与布道的牧师,你应该添加一个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;
}
答
我会在修复代码的地方添加注释。
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;
}
这岂不是简单的内连接的情况下? – Anand 2011-12-23 09:02:46
我想显示所有布道者的传教士。如果传教士没有semons,就不会显示他的细节 – Natasha 2011-12-23 09:03:19
在你的代码中,你有'return $ preacher;'这将返回并且在第一个'$ preacher'已经循环后离开函数。将所有传道者保存在一个单独的数组中,然后返回传教者阵列。 – NoLifeKing 2011-12-23 09:03:23