2013-01-20 111 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