更改查询以将3个表连接在一起

时间:2014-08-08 16:30:19

标签: php mysql sql codeigniter join

在我的数据库中,我有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次。

3 个答案:

答案 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'

SQLFIDDLE DEMO

答案 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来单独查询评论。事实上,使用单独的查询是好的,因为如果注释的数量更多,它会减少获取数据量。