【问题标题】:mysql keyword search across multiple columns跨多个列的mysql关键字搜索
【发布时间】:2010-12-22 20:56:06
【问题描述】:

这个问题的各种化身以前在这里被问过,但我想我会再试一次。

我的数据库布局很糟糕。单个实体(小部件)被拆分为两个表:

CREATE TABLE widgets (widget_id int(10) NOT NULL auto_increment)

CREATE TABLE widget_data ( widget_id int(10), field ENUM('name','size','color','brand'), data TEXT)

这不是那么理想。如果想找到特定名称、颜色和品牌的小部件,我必须在 widget_data 表上进行三向连接。于是我转为合理的表类型:

CREATE TABLE widgets (widget_id int(10) NOT NULL auto_increment, name VARCHAR(32),size INT(3),color VARCHAR(16), brand VARCHAR(32))

这使大多数查询变得更好。但它使搜索变得更加困难。过去,如果我想在小部件中搜索“%black%”,我只会SELECT * FROM widget_data WHERE data LIKE '%black%'。这将为我提供所有黑色小部件实例,或由 blackwell 工业或其他任何东西制造。我什至会确切地知道哪个字段匹配,并可以将其显示给我的用户。

如何使用新的表格布局执行类似的搜索?我当然可以做WHERE name LIKE '%black%' OR size LIKE '%black%'...,但这看起来很笨拙,而且我仍然不知道哪些字段匹配。我可以为要匹配的每一列运行一个单独的查询,这将为我提供所有匹配项以及它们的匹配方式,但这会影响性能。有什么想法吗?

【问题讨论】:

    标签: mysql search keyword multiple-columns


    【解决方案1】:

    您有两个相互冲突的要求。您希望像所有数据都在一个字段中一样进行搜索,但您还想确定匹配的特定字段。

    您的WHERE name LIKE '%black%' OR size LIKE '%black%'... 表达式没有任何问题。正如您定义的那样,这是对表的完全有效的搜索。为什么不只检查代码中的结果以查看匹配的结果呢?这是最小的开销。

    如果您想要更简洁的 SQL 语法,那么您可以在表上创建一个视图,添加一个由连接其他字段组成的额外字段:

    CREATE VIEW extra_widget_data AS
      SELECT (name, size, color, brand,
              CONCAT(name, size, color, brand) as all_fields)
      FROM widget_data;
    

    然后你必须在这个字段上添加一个索引,这需要更多的空间、CPU 时间来维护等等。我认为这不值得。

    【讨论】:

      【解决方案2】:

      您可以在选择列中包含WHERE 表达式的一部分。例如:

      SELECT 
        *, 
        (name LIKE '%black%') AS name_matched,
        (size LIKE '%black%') AS size_matched
      FROM widget_data 
      WHERE name LIKE '%black%' OR size LIKE '%black%'...
      

      然后检查脚本一侧的name_matched 的值。

      不确定它将如何影响性能。在投入生产之前可以随意测试它

      【讨论】:

      • 我一直在寻找类似的搜索部分,但列名 like 太棒了!谢谢分享
      【解决方案3】:

      您可能想了解 MySQL 全文搜索功能,这使您可以匹配多个 varchar 类型的列。

      http://dev.mysql.com/doc/refman/5.1/en/fulltext-search.html

      【讨论】:

      • 有问题的表是innodb,不能改成myisam,所以很遗憾不能选择全文索引
      • 全文索引可用于 InnoDB 或 MyISAM 表,并且只能为 CHAR、VARCHAR 或 TEXT 列创建。
      猜你喜欢
      • 2011-03-17
      • 1970-01-01
      • 2019-02-07
      • 2018-12-16
      • 2013-04-08
      • 2017-05-01
      • 1970-01-01
      • 2011-01-12
      • 1970-01-01
      相关资源
      最近更新 更多