2012-03-21 174 views
2

我有一個自定義工作博客。一切工作正常我只是想知道如果有人知道更好的方式來從MySQL數據庫選擇包含標籤的文章。按標籤選擇博客文章

當前標籤存儲在「blog」表中的「blog_tags」下,並且文章使用LIKE'%tag%'進行了重新劃分。我工作得很好,直到我有2個包含相同單詞的標籤,例如網站和網站設計。

使用上述方法搜索標籤,如網站我會得到包含網站標籤和網站設計的結果。

要解決每個標籤的我加了「*」開頭的解決方案,最終使blog_tags現在看起來像*標籤1 *,*標籤2 *,*標籤3 *,*等等...

現在我只需搜索blog_tags文章,如'%* tag here *%'。這很好,但可能有更好的方法。有任何想法嗎?

目前使用的查詢是:

"SELECT * FROM `blog` WHERE `active` = 'y' AND `blog_tags` LIKE '%*" . str_replace("-", " ", $tag) . "*%' ORDER BY `blog_created` DESC LIMIT " . $startfrom . "," . $limit 

預先感謝!

回答

1

你不應該在數據庫中有多值字段。以你的例子來看,你似乎有博客有很多標籤和標籤對應於許多博客。這是一個多對多的關係。作爲一個經驗法則,多對多關係會生成一個新表格。因此,您應該使用的數據庫模式類似於:

 
Blogs(*Id*, activ, date_created) 
Tags(*Id*, text) 
Blog_Tag(*BlogId*, *TagId*) 

主鍵在星號之間顯示。

所以,如果你想搜索標記爲「MySQL的」你會做這樣的事情所有的博客:

select * from blogs b 
join blog_tag bt on b.id = bt.blogid 
join tags t on bt.tagid = t.id 
where t.text = 'mysql' 

當然,如果你事先知道的標籤識別,你就不需要加入上標籤。

希望這已經消除了一些疑惑。

3

你有一個關係數據庫。它旨在存儲結構化數據。不要發明自己的結構,然後將它們存儲在田間。

這是標準many to many relationship

創建一個表「標籤」和一個關聯表,其中兩列都是外鍵(標籤ID和博客條目ID)。

然後使用JOIN獲取您關心的條目。