簡體   English   中英

使用SQL連接獲取帖子標簽

[英]Getting a posts tags using SQL joins

我正在嘗試在一個SQL查詢中檢索每個博客文章的標簽。 我有一個posts表, post_tags表和一個tags表。 存在post_tags表可刪除帖子和標簽之間的多對多關系。 這是這些表的架構:

| 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數組都具有該帖子的每個標簽的元素。

很感謝任何形式的幫助 :)

從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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM