【问题标题】:Altering a query to join 3 tables together更改查询以将 3 个表连接在一起
【发布时间】:2014-08-08 16:30:18
【问题描述】:

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

我需要将所有三个表连接在一起以获取笑话的类别名称、笑话本身以及与该特定笑话_id 相关的唯一 cmets。

目前我只能加入两个 joke_id = 1 的表。这将返回那个笑话的 cmets。

这个函数存放在我的读控制器里,名字叫笑话:

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 的函数,它只抓取类别、笑话和笑话 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();

}

目前,这只会获取笑话的类别名称和笑话本身。我想要的也是为这个笑话抓住 cmets。如何更改我的查询以返回我需要的信息?

编辑:

这个查询似乎有效:

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 个 cmets,这个笑话显示了 6 次。

【问题讨论】:

    标签: php mysql sql codeigniter join


    【解决方案1】:

    编辑:

    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
    

    我没有你的数据,很难测试,但你可能想试试这个。 这是一个查询。更简洁的方法是获取笑话,然后为该笑话获取 cmets。

    【讨论】:

    • 由于某种原因,查询加载了不同的类别并复制了笑话
    • 我不知道你为什么会得到不同的类别,对于评论检查编辑
    • 编辑后的错误按我的方式抛出了大约十亿个错误,哈哈。感谢您的回复
    【解决方案2】:
    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

    【讨论】:

      【解决方案3】:

      您在此处显示的查询就是您所需要的

      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 来单独查询 cmets。实际上使用单独的查询是好的,因为如果 cmet 的数量更多,它会减少获取数据量。

      【讨论】:

        猜你喜欢
        • 2013-06-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-10-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多