我有一个包含三列的产品表:
它包含类似的值:
product_id | product_name | product_keywords
1 |电脑|电脑,电脑,笔记本电脑,个人电脑,台式电脑
-------------------------------------------------- -------------------------------------------------- --------------“
2 |手机|智能手机,手机,诺基亚,索尼
-------------------------------------------------- -------------------------------------------------- ----------------'
现在我需要一个SQL查询,如果任何客户搜索个人计算机或个人计算机,它将返回product_name =带有product_id = 1的计算机,依此类推。
答案 0 :(得分:1)
虽然我的第一直觉是重新设计架构以使keywords
表具有唯一值以及产品和关键字之间的映射表,但MySQL实际上提供了一种查询逗号分隔字符串的优雅方式使用find_in_set
函数:
SELECT product_id, product_name
FROM products
WHERE FIND_IN_SET ('pc', keywords) > 0 OR
FIND_IN_SET ('personal computer', keywords) > 0
答案 1 :(得分:0)
您可以使用find_in_set。
select * from `table` where find_in_set(' Computer',product_name)
但是将值存储为csv是非常糟糕的数据库设计。
答案 2 :(得分:0)
用最简单的形式你可以写出这样的东西。
SELECT product_id, product_name
FROM test
WHERE product_keywords like '%computer%';
但这不是那么安全,因为您可以在多行中包含关键字' computer'。
如果您可以从关键字中删除空格,则会显示:
个人电脑,电脑,笔记本电脑,个人电脑,台式电脑
然后您可以使用以下代码并保证正确的结果:
SELECT product_id, product_name
FROM test
WHERE CONCAT(',',product_keywords,',') like CONCAT(',%','computer','%,');
只需更换计算机'使用包含用户输入的变量。逗号有助于确保搜索完整关键字,而不仅仅是其中的一部分。