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