1

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

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

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

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

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

编辑

我知道以逗号分隔的形式存储数据不是一个好习惯,但我正在对其他程序员制作的应用程序进行更新。在这个阶段,我不能改变表结构。

谢谢

4

2 回答 2

1

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

但是,更好的方法是标准化 DB 结构,将颜色保存在单独的表中,并在主表和颜色表之间创建一个数据透视表。

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

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

于 2012-10-10T14:58:44.393 回答
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. 否则,您可以构建一个使用 MySQLFIND_IN_SET()函数的查询(在您的应用程序中):

    SELECT *
    FROM   my_table
    WHERE  FIND_IN_SET('red',    colors)
        OR FIND_IN_SET('purple', colors)
        OR FIND_IN_SET('orange', colors)
    
于 2012-10-10T15:01:08.260 回答