简化的SQL搜索

时间:2011-09-01 03:48:56

标签: php sql search

我正在尝试实施小项目,人们可以为某些项目设置标签,并且页面上会显示类似的标签。

示例:

表: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上单独执行此操作。

2 个答案:

答案 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。