Добавление другого соединения с базой данных в мой запрос приводит к тому, что некоторые строки не отображаются - PullRequest
4 голосов
/ 30 марта 2012

Правильно, я совсем не разбираюсь в этом, на самом деле это мой первый запрос на соединение, так что будьте осторожны. Я собираюсь рассказать как можно больше деталей, так как это, вероятно, ударит большинство из вас по лицу, как сковорода, но это делает мой сумасшедший!

У меня проблемы с запросом блога, который я пытаюсь написать в codeigniter. Я создал запрос с двумя объединениями для сообщений, и он классифицируется по трем таблицам: записи, категории и posts_categories. Теперь я тоже пытаюсь присоединиться к таблице комментариев, чтобы подсчитать.

Это код в моей модели, который отображает оба общих сообщения, которые я составил:

            $this->db->select('posts.id,
                            posts.title,
                            posts.slug,
                            posts.content,
                            posts.author,
                            posts.date,
                            posts.time,
                            posts.tags,
                            posts.status,
                            GROUP_CONCAT(categories.name SEPARATOR \'-\') AS categories
                            ');
        $this->db->group_by(array('posts.id'));
        $this->db->from('posts');
        $this->db->join('posts_categories', 'posts_categories.blog_entry_id = posts.id');
        $this->db->join('categories', 'posts_categories.blog_category_id = categories.category_id');
        $query = $this->db->get();
        return $query->result_array();

это результат:

(
[0] => Array
    (
        [id] => 1
        [title] => My first blog post!
        [slug] => my-first-blog-post
        [content] => This is my first blog post. Don't worry, it's just a test, my real blog won't be this boring, hopefully!
        [author] => Joni
        [date] => 2012-01-23
        [time] => 00:00:00
        [tags] => Testing
        [status] => 
        [categories] => Testing-More Tests-Test
    )

[1] => Array
    (
        [id] => 2
        [title] => This is another test-post
        [slug] => this-is-another-test-post
        [content] => Well you guessed it. another boring test post, enjoy!
        [author] => Joni
        [date] => 2012-01-23
        [time] => 00:00:00
        [tags] => Sexy
        [status] => 
        [categories] => Test
    )

)

Теперь, когда я изменю запрос, чтобы реализовать третье соединение для комментариев, вот так:

            $this->db->select('posts.id,
                            posts.title,
                            posts.slug,
                            posts.content,
                            posts.author,
                            posts.date,
                            posts.time,
                            posts.tags,
                            posts.status,
                            GROUP_CONCAT(categories.name SEPARATOR \'-\') AS categories,
                            count(comments.id) as total_comments
                            ');
        $this->db->group_by(array('posts.id'));
        $this->db->from('posts');
        $this->db->join('posts_categories', 'posts_categories.blog_entry_id = posts.id');
        $this->db->join('categories', 'posts_categories.blog_category_id = categories.category_id');
        $this->db->join('comments', 'comments.post_id = posts.id');
        $query = $this->db->get();
        return $query->result_array();

Я в конечном итоге с этим

(
[0] => Array
    (
        [id] => 1
        [title] => My first blog post!
        [slug] => my-first-blog-post
        [content] => This is my first blog post. Don't worry, it's just a test, my real blog won't be this boring, hopefully!
        [author] => Joni
        [date] => 2012-01-23
        [time] => 00:00:00
        [tags] => Testing
        [status] => 
        [categories] => Testing-More Tests-Test
        [total_comments] => 3
    )

)

Если вы сделали это так далеко, извините, что так долго, и просто хочу сказать спасибо заранее

Ура Джони

Ответы [ 3 ]

4 голосов
/ 30 марта 2012

Вам нужно использовать LEFT OUTER JOIN, в противном случае вы получите только сообщения с комментариями.Когда вы выполняете INNER JOIN (по умолчанию), потребуется, чтобы все, что находится слева, имело соответствующий элемент с правой стороны соединения.Если он не находит соответствия с правой стороны, он его пропускает.ЛЕВОЕ НАРУЖНОЕ СОЕДИНЕНИЕ сохранит все элементы с левой стороны объединения независимо от того, есть ли совпадение с правой стороны.

Измените это:

$this->db->join('comments', 'comments.post_id = posts.id'); 

на

$this->db->join('comments', 'comments.post_id = posts.id', 'left outer' );
1 голос
/ 30 марта 2012

Что делает ->join? Если он выполняет внутреннее объединение, ваша проблема, вероятно, состоит в том, что он исключит посты, в которых нет комментариев. Вам нужно будет использовать левое внешнее объединение, чтобы убедиться, что посты без комментариев включены.

0 голосов
/ 30 марта 2012

Из-за быстрого просмотра ваших запросов, я предполагаю, что у вашего 2-го поста нет комментариев, и когда вы пытаетесь объединить комментарии, он не получает 2-й пост.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...