2010-09-18 65 views
3

我有2個表:一個商店標籤,其他商店的文章。有一種模式「通過標籤獲取文章」,其基本上將所有文章都標記爲「x」。在我的文章列表中,我使用了一個名爲Tags的字段,該字段以這種模式'tag1,tag2,tag3,...'存儲數據。複雜的子查詢 - 這可能嗎?

所以,我想通過這樣的只是一個單一的查詢得到的一切工作:

SELECT *, 
     (SELECT tagname 
      FROM `tags_table` 
     WHERE tagurn LIKE 'x') as TAGNAME 
    FROM `articles_table` 
WHERE (Tags LIKE 'TAGNAME,%' OR Tags LIKE '%, TAGNAME' ... and so on) 

我不知道,如果它甚至有可能,但我真的很喜歡使用單個查詢(用子查詢)而不是兩個不同的。

回答

6

這是在數據庫中存儲多對多關係的錯誤方法。

你應該有這樣一個模式:

 articles: [PK] article_id, ... (should have no reference to tags) 
     tags: [PK] tag_id, tag_name, ... 
articles_tags: [FK] article_id, [FK] tag_id 

[PK] =主鍵,[FK] =外鍵

articles_tagsjunction table。現在,您可以使用給定標籤(如果您知道tag_id您甚至不需要JOIN)獲得所有文章:

SELECT article_id, ... 
     FROM articles_tags 
INNER JOIN tags ON tags.tag_id = articles_tags.tag_id 
    WHERE tag_name = 'TAGNAME'