我正在建造一个简单的购物车。我需要允许相关产品。我最初的想法是在产品表中有一个名为tags的db字段,其中包含逗号分隔的标签列表:
tag1,tag2,tag3
当我从数据库中获取产品时,我也可以抓取标签并在逗号上爆炸字符串。
问题是我无法想出一种好方法,然后为具有匹配标记的所有其他产品调用db。有没有办法在SQL中搜索字符串?
任何人都可以想到实现这个目标的好方法
答案 0 :(得分:2)
您可以将FIND_IN_SET()
用于此目的:
SELECT * FROM tableName WHERE FIND_IN_SET('tag1', tags) > 0
但是,我强烈建议您阅读数据库规范化并加入。
Pleaso 不使用提及LIKE
语法的任何答案。例如,WHERE tags LIKE %tag1%
会匹配tag1
,但tag12
也会匹配。
答案 1 :(得分:0)
要在SQL中搜索字符串,您可以使用LIKE
运算符。这是一个例子:
mysql_query("SELECT * FROM table_name WHERE value LIKE '%str%' ");
答案 2 :(得分:0)
考虑使用MySQL LIKE
子句(查看本指南:http://www.tutorialspoint.com/mysql/mysql-like-clause.htm)。您可以在每个标签上使用它,如下所示:
SELECT * FROM `product` WHERE `tags` LIKE '%tag1%' OR `tags` LIKE '%tag2%' OR `tags` lIKE '%tag3'
答案 3 :(得分:0)
我不会在字段中存储逗号分隔字符串的路径,它不是很可扩展(或normalized)。我会把它分成3个不同的表:
products: ------------- id | name ------------- 1 | product 1 2 | product 2 tags: --------------- id | tag --------------- 1 | tag 1 2 | tag 2 product_tags: ---------------------- product_id | tag_id ---------------------- 1 | 1 1 | 2
如果您想查找带有相关标签的产品,您只需
SELECT product_id FROM product_tags WHERE tag_id = TAG_ID
然后,您可以使用更高级的连接语句从products表返回记录(而不仅仅是tags表中的product_id):
SELECT products.* FROM products INNER JOIN product_tags ON product_tags.product_id = products.id WHERE product_tags.tag_id = TAG_ID
它的工作量稍微多一点,但将来会让你头疼。