我有一个数据库,其中的一列包含有关行的一系列信息“标签”,这些信息被存储为以逗号分隔的动态长度列表(字符串)。我在PHP中使用mysqli,我想选择其中任何这些项目与输入字符串中的任何项目匹配的行。
例如,可能有一行描述一个苹果,其中包含标签:“美味,红色,水果,酸,甜,绿色”。我希望此结果显示在类似"SELECT * FROM table WHERE info tags IN ('blue', 'red', 'yellow')"
的查询中,因为它至少有一项重叠(“红色”)。有点像PHP中的“ array_intersect”。
我想如果每行只有一个标签,我可以使用IN
,如果我只使用一个输入标签,但我都可以使用LIKE
,但是两者都是动态长度的。我知道我可以遍历所有输入标签,但是我希望将其放在单个查询中。那可能吗?如果不是,是否可以使用其他结构将标签存储在数据库中以使其成为可能(除了逗号分隔的字符串以外)?
答案 0 :(得分:0)
我认为最好的方法是创建tags
表(id +标签),然后分离保存table_id和tag_id的“ table_tags”表。
这意味着使用JOINS获得最终结果。
另一种(但懒惰的)解决方案是在标签前加上逗号后缀,因此整列包含如下内容:
,tasty,red,fruit,sour,sweet,green,
您可以进行LIKE搜索,而不必担心单词重叠(即红色与无聊),并且仍然可以使用LIKE '%,WORD,%'