2013-11-27 46 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 

作爲一個單獨的查詢來獲取標籤的特定職位。在這兩者之間,您應該能夠在應用程序級別創建嵌套數組。