mysql在列中的逗号分隔值上选择行

时间:2015-05-12 05:46:25

标签: mysql sql select

我有一个包含三列的产品表:

  1. PRODUCT_ID
  2. PRODUCT_NAME
  3. product_keywords
  4. 它包含类似的值:

      

      product_id | product_name | product_keywords
      1 |电脑|电脑,电脑,笔记本电脑,个人电脑,台式电脑
      -------------------------------------------------- -------------------------------------------------- --------------“
      2 |手机|智能手机,手机,诺基亚,索尼
      -------------------------------------------------- -------------------------------------------------- ----------------'

    现在我需要一个SQL查询,如果任何客户搜索个人计算机或个人计算机,它将返回product_name =带有product_id = 1的计算机,依此类推。

3 个答案:

答案 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','%,');

只需更换计算机'使用包含用户输入的变量。逗号有助于确保搜索完整关键字,而不仅仅是其中的一部分。