使用逗号分隔的用户输入搜索逗号分隔的数据库字段

时间:2012-10-10 14:51:06

标签: mysql sql

我在数据库字段中以逗号分隔存储数据。就像在字段colors中说的那样,有以下几行。

red,blue, green
blue, white, purple, pink
yellow, khaki, maroon, orange
gray, lemon, black, brown

下一个用户有一个html格式的文本框,在那里他以逗号分隔的形式输入颜色。我想搜索数据库以返回与其输入匹配的记录。例如。

如果我输入red, purple, orange,那么查询应返回三行,因为第一行有红色,第二行有紫色,第三行有橙色。

我没有比将用户输入分解为数组并循环遍历每种颜色并搜索数据库以获得结果更容易。有没有更简单的方法呢?

修改

我知道以逗号分隔的形式存储数据不是一个好习惯,但我正在处理由其他程序员制作的应用程序更新。在这个阶段,我无法改变桌面结构。

由于

2 个答案:

答案 0 :(得分:1)

不幸的是,没有更简单的方法。

然而,更好的方法是normalize the DB structure,将颜色保存在单独的表中,并在主表和颜色表之间创建一个数据透视表。

之后,您还必须拆分用户输入的值,获取颜色的ID,然后在数据透视表上搜索。

这样做的主要优点是您在搜索时可以使用数据库索引。

答案 1 :(得分:1)

  1. 当然,如果可以选择,则规范化是最好的方法:

    CREATE TABLE colors ( color VARCHAR(6) NOT NULL PRIMARY KEY );
    
    INSERT INTO colors VALUES
      ('red'), ('blue'), ('green'), ('white'), ('purple'), ('pink'),
      ('yellow'), ('khaki'), ('maroon'), ('orange'), ('gray'),
      ('lemon'), ('black'), ('brown');
    
    CREATE TABLE itemColors (
      item_id BIGINT UNSIGNED NOT NULL,
      color   VARCHAR(6)      NOT NULL,
      FOREIGN KEY (item_id) REFERENCES my_table (id),
      FOREIGN KEY (color)   REFERENCES colors   (color)
    );
    
    INSERT INTO itemColors (item_id, color)
      SELECT my_table.id, colors.color
      FROM   my_table JOIN colors ON FIND_IN_SET(colors.color, my_table.colors);
    
    ALTER TABLE my_table DROP COLUMN colors;
    

    然后人们只需要做:

    SELECT *
    FROM   my_table
    WHERE  id IN (
                   SELECT item_id
                   FROM   itemColors
                   WHERE  color IN ('red','purple','orange')
                 )
    
  2. 否则你可以构建一个使用MySQL FIND_IN_SET()函数的查询(在你的应用程序中):

    SELECT *
    FROM   my_table
    WHERE  FIND_IN_SET('red',    colors)
        OR FIND_IN_SET('purple', colors)
        OR FIND_IN_SET('orange', colors)