2012-03-29 1 views
4

そうですね、これは特に熟練していません。これは実際には初めての結合クエリです。私はできるだけ多くの詳細を与えるつもりですが、おそらくフライパンのような顔をしてあなたのほとんどを打つだろうが、それは私のナッツをやっている!クエリに別のデータベース結合を追加すると一部の行が表示されなくなる

私はcodeigniterに書き込もうとしているブログのクエリに問題があります。投稿のための2つの結合を持つクエリを設定しました.3つのテーブルを使用してカテゴリを作成しました。投稿、カテゴリ、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 
    ) 

今とき、私コメントを3番目の結合を実装するようにクエリを変更します。

  $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 
    ) 

で終わるが、申し訳ありませんが、それはとても長いです、とだけしたい場合は、事前に感謝を言います!あなたはLEFT OUTERを使用する必要が

+0

何が問題ですか?どの列が見えませんか? – safarov

+0

2番目の投稿にコメントがない場合は、表示されません。これはあなたの最下位の結果で起こっていることです。 – OneSneakyMofo

答えて

4

ジョニ

歓声は、あなたがコメントだけを持って記事を取得しますそれ以外の場合は登録しよう。 INNER JOIN(デフォルト)を実行すると、左側にあるものは結合の右側に一致する要素が必要です。右側に一致するものが見つからなければ、それは省略されます。 LEFT OUTER JOINは、右側に一致するかどうかにかかわらず、結合の左側にあるすべての要素を保持します。

変更この:

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

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

+1。私はちょうどこれを入力しようとしていた。コメント欄に彼女の投稿がなぜ表示されないのか説明しました。 – OneSneakyMofo

+0

これはとても感謝しています。それはあなたの残りの人のためのケーキだと言った! – Joni

1

から->joinは何をしますか?内部結合を行っている場合は、コメントがない投稿は除外される可能性があります。そこには左外部結合を使用して、コメントのない投稿が含まれるようにする必要があります。

+0

申し訳ありませんが、それを逃していたあなたのおかげで助けて – Joni

0

あなたの質問をすばやく見て、私はあなたの第2の投稿にはコメントがないと仮定しています。あなたがコメントの投稿をしようとすると、2番目の投稿を受け取りません。

関連する問題