我正在尝试实施小项目,人们可以为某些项目设置标签,并且页面上会显示类似的标签。
示例:
表:item_data 第1行:
item_id = 1 (event)
Tags = "Rugby, Tickets, Give away, Sesssions, Prizes"
第2行:
item_id = 2 (Ticket booking)
Tags = "New Zeland, Travel, Booking, Tickets, Rugby"
第3行:
item_id = 3 (car for sale)
Tags = "New Zeland, Blue, Ford, Sedan"
是纯粹用SQL来获取给定标记集的所有匹配item_id。 从第1行获取标签数据并找到所有其他行中每个标签的所有匹配记录?
我可以使用php和mysql混合使用,我想知道是否有人有更好的方法在sql上单独执行此操作。
答案 0 :(得分:1)
我建议使用数据规范化(http://www.bkent.net/Doc/simple5.htm)。如果你要保留标签,如“标签a,标签b标签c等”,那么你必须选择数据库中的每个标签,将它们分成数组并对其进行匹配,以便找到相关数据。
我建议为Items设置一个表,为另外添加新标签时增加的标签然后将第三个表映射到tag_id。完成此操作后,您可以根据特定标签和标签组进行选择以获得结果。
|Item_table |
|-------------------------|
|item_id | Desc |
|1 | Event |
|2 | Ticket Booking |
|-------------------------|
|Tag_Table |
|------------|
|id | tag |
|1 | Rugby |
|2 | Blue |
|Tag_Map |
|-------------------------|
|id | tag id | item id |
|1 | 1 | 1 |
|2 | 1 | 2 |
您可以在地图表和标记表中创建索引。你会像这样使用它:
SELECT it.Desc FROM Item_Table it, Tag_Table tt, Tag_Map tm WHERE tt.id = tm.tag_id AND it.item_id = tm.item_id and (tt.tag = "Rugby" or tt.tag = "Blue");
您只需要将()中的最后一部分更改为一个标记,或者继续添加“或”和另一个标记,这将为您提供与任何给定标记匹配的任何和所有项目描述。
我知道3个表看起来很多要管理但是相信我,如果你的项表和标签表开始增长到成千上万你(而你的mysql服务器)会欣赏这种风格的数据存储。
答案 1 :(得分:0)
SELECT * FROM TABLE WHERE `Tags` LIKE %Rugby% OR `Tags` LIKE %New Zeland% OR .....
将显示Tag
中所有“橄榄球”或“新西兰”或......的行。
您可以创建存储过程并将搜索“标记”传递给它。在过程中创建正确的SQL QUERY。