Php 使用SQL连接获取posts标记

Php 使用SQL连接获取posts标记,php,mysql,sql,database,database-schema,Php,Mysql,Sql,Database,Database Schema,我试图在一个SQL查询中检索每个博客文章的标记。我有一个posts表、post_tags表和一个tags表。post_标记表的存在是为了删除post和标记之间的多对多关系。以下是这些表的模式: | p_id | c_id | u_id | title | body | published | ---------------------------------------------------------------------- | 1 | 1

我试图在一个SQL查询中检索每个博客文章的标记。我有一个posts表、post_tags表和一个tags表。post_标记表的存在是为了删除post和标记之间的多对多关系。以下是这些表的模式:

| 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;
}
它有点工作,每个帖子的帖子标签都会被检索,但是我有重复的帖子。以下是查询结果的打印转储:

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
                )

        )

)
在我看来,它不是返回帖子的每个标签,而是返回多个带有不同标签的帖子。我需要它,以便每个帖子的标签数组都有一个元素用于该帖子的每个标签

非常感谢您的帮助:

从SQL检索数据后,在PHP级别对其进行过滤:

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;
}
重复问题:检查我的答案,得到你想要的。我提到了重复行会发生在回答的解决方案中。