【问题标题】:Searching comma separated database field with comma separated user input使用逗号分隔的用户输入搜索逗号分隔的数据库字段
【发布时间】:2012-10-10 14:51:05
【问题描述】:

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

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

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

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

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

编辑

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

谢谢

【问题讨论】:

标签: mysql sql


【解决方案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)
    

【讨论】:

  • 我想我会选择第二个选项。为此,我必须将用户输入分解为数组并循环遍历它以创建 FIND_IN_SET 查询,就像您所做的那样。谢谢朋友
【解决方案2】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-04-24
    • 2013-07-03
    • 2013-06-07
    • 2011-11-14
    • 2013-06-21
    • 2018-12-18
    • 2018-12-08
    相关资源
    最近更新 更多