【发布时间】:2012-01-28 19:14:42
【问题描述】:
我试图在一个 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 数组对于该帖子的每个标签都有一个元素。
非常感谢任何帮助:)
【问题讨论】:
-
重复问题:stackoverflow.com/questions/9047168/… 在那里查看我的答案以获得您想要的。我提到重复的行会出现在已回答的解决方案中。
标签: php mysql sql database database-schema