2013-01-20 109 views
3

我實現一個Tag系統...的MySQL/PHP - 標籤系統

目前,我有表tagsnamedescriptioncreatedby領域。

和表images有一個字段tags。在這個字段中,我將把標記名稱從tags表中以逗號分隔。

但是,如果我想要獲取帶有標記的所有圖像Foo我該如何形成查詢?因爲該字段將包含用逗號分隔的多個標籤。

+0

我做現在沒有嘗試過任何東西,因爲我不知道如何從查詢中獲得。 – Fr0z3n

+2

我會規範化數據。創建一個包含每個圖像的每個標籤的單獨記錄的表格。這將使你的查詢(和一般生活)更簡單恕我直言。 – Tom

+0

@Tom,在數據庫的使用和速度方面,最好使用你的方法來覆蓋我的方法? – Fr0z3n

回答

3

不確定你是否想過規範化圖像表,但這將是最佳解決方案。

而不必

enter image description here

結構的表這樣

enter image description here

然後你就可以運行該SQL語句帶有特定標籤

SELECT * FROM images 
WHERE tags = 'forest'; 
返回所有圖片

或者,如果有你需要保持你的表在當前格式的原因,你可以在上面的兩個例子使用

SELECT * FROM images 
WHERE tags LIKE '%forest%'; 

這個詞「森林」的標籤,你正在尋找

+0

我會走得更遠,並創建一個帶'id'和'url'列的'urls'表,以及一個帶'url_id'和'tag'列的'tags'表。 – inhan

+0

這樣做,我需要重寫所有函數來從數據庫中獲取/插入圖像。所以相反,我做湯姆說,一張桌子只是爲了記錄圖像ID和標籤ID,並加入他們的查詢。 – Fr0z3n

2

嘗試類似的東西:

SELECT * FROM images WHERE tags = 'Foo' OR tags LIKE 'Foo,%' OR tags LIKE '%,Foo' OR tags LIKE '%,Foo,%' 
0

存儲標籤的ID在這樣tags領域: '3,17,55,'

時,你會Exec中查詢數據庫,你會能夠使用快速結構是這樣的:

SELECT * FROM images WHERE INSTR(tags,',$tag_id,')>'0' 

而不是使用 「LIKE '%$ TAG_ID'」,這是

+2

以逗號分隔的存儲標籤實際上並不是一個好主意。 – Zar

+0

我同意,但主題首發會這樣做 – dimaninc

+0

是真的。除了你的答案之外,解釋爲什麼這是糟糕的並且指導他走向更好的道路可能是一個好主意。 – Zar