【问题标题】:Querying a table where the field contains any order of given text strings查询字段包含任意顺序的给定文本字符串的表
【发布时间】:2014-04-22 00:33:04
【问题描述】:

我想查询一个表如下:

我有一个名为“类别”的字段,我的输入匹配包含 N 个单独的单词。我希望查询匹配包含所有 N 个单词的所有行,但顺序不限。

例如,如果字段类别包含“hello good morning world”,我的输入查询可以包含“hello morning”或“good”或“world hello”,并且都与查询匹配。

如何制定这样的 SQL 表达式?

如果可以使查询不区分大小写,那就太好了。

【问题讨论】:

    标签: php mysql sql regex database


    【解决方案1】:

    如果您使用 MySQL,您可以使用boolean fulltext search feature 来实现此目的。您可以在每个术语前面加上一个 +,然后只返回包含所有术语的结果,以任何顺序排列。您需要确保包含类别字段的列具有指定的全文索引才能使其正常工作。其他数据库引擎可能具有类似的功能。因此,例如,假设类别列上有全文索引,您可能会执行以下操作...

    SELECT * FROM myTable WHERE MATCH (category) AGAINST ('+term1 +term2 +term3' IN BOOLEAN MODE);
    

    我会避免使用“LIKE”运算符,因为其他人建议您将不得不担心混合大小写的问题,如果您有一个大型数据库,在 LIKE 搜索词的前面使用 % 将会导致全表扫描,而不是使用对性能来说很糟糕的索引。

    【讨论】:

      【解决方案2】:

      我不是在编写将为您构建此查询的循环。这样可以完成工作,但效率很低。

      SELECT * FROM table 
        WHERE (
          TOUPPER(category) LIKE '*HELLO*' AND
          TOUPPER(category) LIKE '*GOOD*' AND
          TOUPPER(category) LIKE '*MORNING*' AND
          TOUPPER(category) LIKE '*WORLD*'
          );
      

      您还可以使用带有 SQL 的 REGEX 进行研究。

      【讨论】:

        猜你喜欢
        • 2015-03-24
        • 1970-01-01
        • 2022-11-30
        • 1970-01-01
        • 1970-01-01
        • 2020-07-22
        • 2021-03-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多