【问题标题】:reverse match of multiple words多个单词的反向匹配
【发布时间】:2010-10-22 13:37:22
【问题描述】:

感谢您阅读本文。希望你能帮助我。

当我有一个包含这些行值的 Mysql 表时

身份证|搜索
========
1|蝴蝶
2|美国
3|美国鸟类
4|美国蝴蝶

无论搜索词的数量或顺序如何,我如何判断哪些行的“搜索”列中的所有词都出现在字符串“butterflies of america”中。

(我想在这个例子中检索 1,2 和 4) 我现在使用编码循环来解决这个问题,如果用 mysql 更有效地修复它会很好。我尝试了全文搜索和正则表达式,但完全卡住了。发送。

【问题讨论】:

    标签: mysql select words


    【解决方案1】:

    嵌套替换,没有子查询。

    SELECT id, search
    FROM  a 
    WHERE LENGTH( TRIM( 
    REPLACE( REPLACE( REPLACE( 
    CONCAT(  ' ', search,  ' ' ) ,  
    ' butterflies ',  ' ' ) ,  ' of ',  ' ' ) ,  ' america ',  ' ' ) ) ) = 0
    
            id  search
            1   butterflies
            2   america
            4   america butterflies
    

    我在要搜索的单词中添加了书尾空格,以确保您不匹配单词的中间(例如,“coffee”中的“of”)。此外,我在search 短语中添加了空格书挡,以说明第一个和最后一个单词。

    【讨论】:

      【解决方案2】:

      这是我尝试过的一种方法(虽然不是很有效):

      select search, replace(filtered, 'butterflies', '') as filtered from (
         select search, replace(filtered, 'of', '') as filtered from (
            select search, replace(search, 'america', '') as filtered from table_name a
         ) b
      ) c;
      

      此查询将为您提供如下内容:

      +---------------------+----------+
      | search              | filtered |
      +---------------------+----------+
      | butterflies         |          |
      | america             |          |
      | birds of america    | birds    |
      | america butterflies |          |
      +---------------------+----------+
      

      完成这项工作的最后一部分给我带来了一些麻烦……您需要一个 where 子句,它将返回所有“空”行(即仅包含空白字符)。

      这将过滤掉第三行并返回您想要的结果集。但是,我无法使用 trim() 让它工作,我不知道为什么。

      例如,我试过:

      where length(trim(c.filtered)) = 0;
      

      这并没有给我想要的结果集。我现在没有时间研究这个问题,但我想提一下这种方法,以防其他人想要插话并完成解决难题。如果没有,我将在今天晚些时候或明天尝试进一步研究。

      【讨论】:

      • 嗨,马特,我真的很喜欢你的聪明方法。但是您不认为这种方法会产生缓慢的查询吗?嵌套也将依赖于代码来生成正确的查询。我还是希望能找到一个独立于代码的解决方案。 :-)
      • 我同意,它可能不是性能最高的查询,但性能可能是可以接受的。诸如 ibatis/mybatis (mybatis.org/java.html) 之类的持久性框架可用于在代码之外生成诸如此类的动态查询。
      【解决方案3】:
      SELECT * 
      FROM table_name 
      WHERE search LIKE '%butterflies%' 
        AND search LIKE '%of%' 
        AND search LIKE '%america%';
      

      SELECT * 
      FROM table_name 
      WHERE search REGEXP 'butterflies|of|america'; // not working
      

      如果我没有遗漏什么:)

      编辑:我错过了一些东西:(

      【讨论】:

      • 哇,回复快,谢谢!我试过你的建议。您的第一个 SELECT 仅返回记录 1 和 2,但我也想检索 4(“美国”和“蝴蝶”都出现在字符串中)。第二个 SELECT 返回所有记录,但我不想要记录 3(字符串中没有出现'birds')。关于如何调整正则表达式的任何想法?
      • 现在我意识到你想要什么了。希望很快会提供解决方案:)
      • 好的,再试一次,现在查询没有返回任何记录;它要求包含所有单词的记录 (butterflies + of + america),并且没有任何记录包含所有单词。将 AND 更改为 OR 没有好处(再次返回所有记录)。
      • 我不认为这可以通过一个查询来完成。存储过程可以完成这项工作,也可以只使用脚本来查找正确的记录。
      • 啊,我们的 cmets 过了,好吧,我等 :-)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-08
      • 1970-01-01
      • 2011-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多