在我的数据库中,我有3个表。
笑话:
CREATE TABLE IF NOT EXISTS `jokes` (
`joke_id` int(11) NOT NULL AUTO_INCREMENT,
`joke` varchar(1024) NOT NULL,
`category_id` int(11) NOT NULL,
`vote` int(255) NOT NULL,
`date_added` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`joke_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
类别:
CREATE TABLE IF NOT EXISTS `category` (
`category_id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(51) NOT NULL,
PRIMARY KEY (`category_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
最后,评论:
CREATE TABLE IF NOT EXISTS `comments` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(40) NOT NULL,
`comment` text NOT NULL,
`joke_id` int(11) NOT NULL,
`post_id` int(11) NOT NULL,
`date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
我需要将所有三个表连接在一起以获取笑话的类别名称,笑话本身以及与该特定joke_id相关的唯一注释。
目前我只能加入joke_id = 1的两个表。这将返回该笑话的评论。
此函数存储在我的读取控制器中,名称为Joke:
public function joke($joke_id = FALSE)
{
if ($joke_id === FALSE) redirect('main'); //go to default controller
$data['results'] = $this->comments_m->getComments($joke_id, $this->uri->segment(2));
$this->load->view('template/header');
$this->load->view('template/sidebar');
$this->load->view('content/read', $data);
$this->load->view('template/footer');
}
模型(getjokes_m)有一个名为readJokes的函数,它只捕获类别,笑话和joke_id来读取一个特定的笑话:
function readJokes($joke_id)
{
$query = $this->db->query("SELECT j.*, c.name FROM jokes j LEFT JOIN category c ON c.category_id = j.category_id WHERE joke_id = '$joke_id'") or die("No results found" );
//displays the results
return $query->result();
}
目前,这只会导致获取笑话的类别名称和笑话本身。我想要的是抓住这个笑话的评论。如何更改查询以返回我需要的信息?
编辑:
此查询似乎有效:
SELECT c.name, j.*, co.* FROM jokes j LEFT JOIN category c ON c.category_id = j.category_id LEFT JOIN comments co ON co.joke_id = j.joke_id WHERE j.joke_id = '$joke_id'"
但与此同时,由于某些原因,这个笑话已被评论多次。那个笑话有6条评论,这个笑话有6次。
答案 0 :(得分:0)
编辑:
SELECT j.joke AS 'Joke', c.name AS 'Category', 'Comments : ' AS 'Comments'
FROM jokes j
LEFT JOIN category c ON c.category_id = j.category_id
WHERE j.joke_id = '1'
UNION
SELECT '' AS 'Joke', '' AS 'Category', c.comment AS 'Comments'
FROM comments c
WHERE c.joke_id = '1'
LIMIT 0 , 30
我没有你的数据,很难测试,但你可能想试试这个。 这是一个查询。一个更干净的方法是获取笑话,然后该笑话id获得评论。
答案 1 :(得分:0)
SELECT c.*, j.*, co.*
FROM jokes j
INNER JOIN category c ON c.category_id = j.category_id
INNER JOIN comments co ON co.joke_id = j.joke_id
WHERE j.joke_id = '1'
答案 2 :(得分:0)
您在此处显示的查询是您需要的
SELECT c.name, j.*, co.* FROM jokes j LEFT JOIN category c ON c.category_id = j.category_id LEFT JOIN comments co ON co.joke_id = j.joke_id WHERE j.joke_id = '$joke_id'"
或者您可以通过提供笑话ID来单独查询评论。事实上,使用单独的查询是好的,因为如果注释的数量更多,它会减少获取数据量。