2013-11-27 35 views
0

我有三个表:喜欢用以下结构的多维数组MySQL的我怎么组合这些表?

blog_posts 
    int id (auto increment) 
    varchar(255) title 
    text content 

blog_tags 
    int id (auto increment) 
    varchar(63) name 

blog_posttags 
    int id (auto increment) 
    int post_id 
    int tag_id 

我怎样才能获得(最好用尽可能少的可能查询)这个数据?

我可以计算出如何使从数据库中排列,但不知道如何得到它这样做而不进行查询,我收到,看看哪些标签属于它的每一个博客帖子。

$blogposts = array(
    array(
     'id' => 0, 
     'title' => 'blogpost title', 
     'content' => 'blogpost content', 
     'tags' => array(
      'tagname1', 'tagname2', 'tagname3', ..., 
     ) 
    ), 
    ... (multiple blogposts because WHERE condition may return more than 1) 
) 

我想像我必须使用UNIONJOIN或类似的东西,但我没有真正拥有先进的MySQL的语句经历。

编辑:你可以假设在blog_posttags一个tag_idblog_tags也存在,也一样有post_idblog_posts

回答

2

使用MySQL的GROUP_CONCAT功能得到一个查询所有标签:

SELECT a.id 
     ,a.title 
     ,a.content 
     ,(  SELECT GROUP_CONCAT(b.name) 
       FROM blog_tags b 
       JOIN blog_posttags c 
       ON  b.id = c.tag_id 
       WHERE c.post_id = a.id 
     ) AS tags 
FROM blog_posts a 

将串连像标签:

id title  content   tags 
------------------------------------------- 
1 Blog 1  blah blah blah funny,work 
2 Next Post yadda yadda  school,work 

它返回一个这样的数组:

$blogposts = array(
    array(
     'id' => 0, 
     'title' => 'blogpost title', 
     'content' => 'blogpost content', 
     'tags' => 'tagname1,tagname2,tagname3' 
    ), 
//etc 
); 

然后你只需要运行一个像这样的循环分裂逗号分隔标记字符串

foreach($blogposts as $k => $v){ 
    $blogposts[$k]['tags'] = explode(',', $v['tags']); 
} 

这里是样品SQL Fiddle与一对夫妇假标签和帖子中,我使用发布

编辑

之前测试此

下面是实现相同的结果,而无需使用一个子查询的另一种方法:

SELECT  a.id 
      ,a.title 
      ,a.content 
      ,GROUP_CONCAT(c.name) AS tags 
FROM  blog_posts a 
JOIN  blog_posttags b 
ON   a.id = b.post_id 
JOIN  blog_tags c 
ON   b.tag_id = c.id 
GROUP BY a.id 
+2

我喜欢ANSW ERS与SQL小提琴例子+1 –

+1

[sqlFiddle(http://sqlfiddle.com/#!2/8f26f/13/0)​​同你的答案以上只是更容易阅读(至少对我来说反正)。 –

+0

哈那很有趣,我是工作在非子查询例子,看起来几乎是一样的你 – WebChemist

0

你迅速匹配到岗位标签上的信息会像基本的查询。

Select bp.Id, bp.title, bp.content, bt.name 
from blog_posts bp 
JOIN blog_posttags bpt ON bp.Post_id = bpt.post_id 
JOIN blog_tags bt ON bt.tag_id = bpt.tag_id 

这会得到多个行,每个行匹配一个帖子到一个标签。分组标记到一个数组是不是真的东西,你可以在SQL边做,但你可以做

Select bt.name 
from blog_posts bp 
JOIN blog_posttags bpt ON bp.Post_id = bpt.post_id 
JOIN blog_tags bt ON bt.tag_id = bpt.tag_id 
WHERE bp.Id = 12345 

作为一个单独的查询来获取标签的特定职位。在这两者之间,您应该能够在应用程序级别创建嵌套数组。