2012-01-28 5 views
0

Я пытаюсь получить теги каждого сообщения в блоге в одном запросе SQL. У меня есть таблица posts, таблица post_tags и таблица tags. Существует таблица post_tags, чтобы удалить отношения «многие-ко-многим» между сообщениями и тегами. Вот схема для этих таблиц:Получение тегов сообщений с использованием SQL-соединений

| p_id | c_id | u_id | title |  body |  published  | 
---------------------------------------------------------------------- 
| 1 | 1 | 1 | first post| lorem ipsum | 2012-01-27 18:37:47 | 


| p_id | t_id | 
--------------- 
| 1 | 3 | 


| t_id |  name |  slug | 
------------------------------------ 
| 3 | programming | programming | 

И метод PHP Я использую:

public function getLatestPosts() 
{ 
    $query = $this->db->query('SELECT title, clean_title, body, published, name, slug 
           FROM posts 
           LEFT JOIN post_tags ON posts.p_id=post_tags.p_id 
           LEFT JOIN tags ON post_tags.t_id=tags.t_id 
           ORDER BY published DESC'); 
    $posts = array(); 
    foreach ($query->result() as $row) 
    { 
     $posts[] = array('title' => $row->title, 
          'clean_title' => $row->clean_title, 
          'body' => $row->body, 
          'published' => $row->published, 
          'tags' => array('name' => $row->name, 
              'slug' => $row->slug)); 
    } 
    print_r($posts); 
    return $posts; 
} 

Это своего рода работы, должности теги быть извлечено для каждой должности, но у меня есть повторяющиеся сообщения. Вот print_r свалка результатов запроса:

Array 
(
    [0] => Array 
     (
      [title] => Second blog post, this is a pretty long title 
      [clean_title] => second-blog-post-this-is-a-pretty-long-title 
      [body] => Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus eget est sit amet libero volutpat eleifend facilisis sollicitudin nisl. Nulla elit eros, semper eget tincidunt quis, egestas a nisl. Duis tempor tempus sapien consequat pellentesque. Cras vitae orci risus. Duis urna velit, interdum ac consectetur nec, condimentum non tellus. Sed nec nibh nisi. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Cras purus nulla, tincidunt quis placerat a, interdum at turpis. Pellentesque in lectus lacus. Sed at venenatis neque. 
      [published] => 2012-01-27 20:15:52 
      [tags] => Array 
       (
        [name] => 
        [slug] => 
       ) 

     ) 

    [1] => Array 
     (
      [title] => This is my first post! 
      [clean_title] => this-is-my-first-post 
      [body] => Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus eget est sit amet libero volutpat eleifend facilisis sollicitudin nisl. Nulla elit eros, semper eget tincidunt quis, egestas a nisl. Duis tempor tempus sapien consequat pellentesque. Cras vitae orci risus. Duis urna velit, interdum ac consectetur nec, condimentum non tellus. Sed nec nibh nisi. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Cras purus nulla, tincidunt quis placerat a, interdum at turpis. Pellentesque in lectus lacus. Sed at venenatis neque. 
      [published] => 2012-01-27 18:37:47 
      [tags] => Array 
       (
        [name] => programming 
        [slug] => programming 
       ) 

     ) 

    [2] => Array 
     (
      [title] => This is my first post! 
      [clean_title] => this-is-my-first-post 
      [body] => Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus eget est sit amet libero volutpat eleifend facilisis sollicitudin nisl. Nulla elit eros, semper eget tincidunt quis, egestas a nisl. Duis tempor tempus sapien consequat pellentesque. Cras vitae orci risus. Duis urna velit, interdum ac consectetur nec, condimentum non tellus. Sed nec nibh nisi. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Cras purus nulla, tincidunt quis placerat a, interdum at turpis. Pellentesque in lectus lacus. Sed at venenatis neque. 
      [published] => 2012-01-27 18:37:47 
      [tags] => Array 
       (
        [name] => android 
        [slug] => android 
       ) 

     ) 

    [3] => Array 
     (
      [title] => This is my first post! 
      [clean_title] => this-is-my-first-post 
      [body] => Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus eget est sit amet libero volutpat eleifend facilisis sollicitudin nisl. Nulla elit eros, semper eget tincidunt quis, egestas a nisl. Duis tempor tempus sapien consequat pellentesque. Cras vitae orci risus. Duis urna velit, interdum ac consectetur nec, condimentum non tellus. Sed nec nibh nisi. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Cras purus nulla, tincidunt quis placerat a, interdum at turpis. Pellentesque in lectus lacus. Sed at venenatis neque. 
      [published] => 2012-01-27 18:37:47 
      [tags] => Array 
       (
        [name] => windows 
        [slug] => windows 
       ) 

     ) 

) 

Как я вижу это, вместо того, чтобы вернуться каждый тег на пост, это возвращение более чем один из этой должности только с различными метками. Мне это нужно, так что массив tags для каждого сообщения имеет элемент для каждого тега этого сообщения.

Любая помощь очень высоко ценится :)

+0

дубликатом вопрос: http://stackoverflow.com/ вопросы/9047168/retrieve-tags-based-on-post-id/9047351 # 9047351 Проверьте мой ответ, чтобы получить то, что вы хотите. Я упомянул о повторяющихся строках с ответом. –

ответ

0

Фильтр ваши данные на уровне PHP после того, как вы извлекаемые его из SQL:

public function getLatestPosts() 
{ 
    $query = $this->db->query('SELECT p_id, title, clean_title, body, published, name, slug 
           FROM posts 
           LEFT JOIN post_tags ON posts.p_id=post_tags.p_id 
           LEFT JOIN tags ON post_tags.t_id=tags.t_id 
           ORDER BY published DESC'); 
    $posts = array(); 
    foreach ($query->result() as $row) 
    { 
     if (!isset($posts[$row->p_id])) { 
      $posts[$row->p_id] = array('title' => $row->title, 
             'clean_title' => $row->clean_title, 
             'body' => $row->body, 
             'published' => $row->published, 
             'tags' => array()); 
     } 
     $posts[$row->p_id]['tags'][] = array('name' => $row->name, 
              'slug' => $row->slug); 
    } 
    print_r($posts); 
    return $posts; 
} 
Смежные вопросы