【问题标题】:Logical AND operator in mySql REGEXP?mySql REGEXP中的逻辑AND运算符?
【发布时间】:2013-03-28 16:26:18
【问题描述】:

我使用 MySql 正则表达式:

SELECT * FROM myTable
WHERE title REGEXP "dog|cat|mouse";

数据集很小,所以我不关心性能。我更喜欢这个而不是 LIKE 表示法,因为我不必连接一堆“LIKE”语句。

但是,上述符号使用逻辑 OR 运算符。是否有逻辑 AND 运算符,以便只匹配包含所有关键字的行?

(我使用的是 InnoDB,所以全文搜索不是一个选项)

【问题讨论】:

    标签: mysql regex


    【解决方案1】:

    除了连接 AND 之外真的没有很好的解决方案:

    SELECT * FROM myTable
    WHERE title REGEXP "dog"
    AND title REGEXP "cat"
    AND title REGEXP "mouse"
    

    否则,正则表达式将如下所示:

    SELECT * FROM myTable
    WHERE title REGEXP "(dog.*cat.*mouse)|(dog.*mouse.*cat)|(mouse.*dog.*cat)|(mouse.*cat.*dog)|(cat.*dog.*mouse)|(cat.*mouse.*dog)"
    

    【讨论】:

      【解决方案2】:

      您可以在它们之间添加多个带有AND 的条件:

      SELECT * FROM myTable
      WHERE title REGEXP "dog" AND title REGEXP "cat" AND title REGEXP "mouse";
      

      也许这里不需要 REGEXP,您可以使用 INSTR 代替(常规通常较慢):

      SELECT * FROM myTable
      WHERE INSTR(title, "dog") AND INSTR(title, "cat") AND INSTR(title, "mouse");
      

      【讨论】:

        【解决方案3】:

        AND 操作可能只能由 mysql-AND 访问:

        WHERE title REGEXP 'dog' AND title REGEXP 'cat' AND title REGEXP 'mouse'
        

        这只会显示所有关键字都在标题字段中的条目。喜欢

        title = "this is about mouse, cat and dog"
        

        【讨论】:

          【解决方案4】:

          您可以在布尔模式下使用全文搜索:

          SELECT * FROM table WHERE MATCH(colmun_name) AGAINST('+dogs +cat' IN BOOLEAN MODE);
          

          你必须先索引你的表:

          ALTER TABLE table ADD FULLTEXT(column_name);
          

          【讨论】:

            【解决方案5】:

            如果您的标题包含所有搜索词,例如:

            Anything mouse anything cat anything dog anything

            然后,您将拥有以任意顺序(例如狗、猫和老鼠)重复 3 次的标题中的所有搜索词。

            Anything mouse anything cat anything DOG anything

            Anything mouse anything CAT anything dog anything

            Anything MOUSE anything cat anything dog anything

            因此,您可以在不连接 AND 的情况下执行此操作:

            SELECT * FROM myTable WHERE REPEAT(title,3) RLIKE '.*dog.*cat.*mouse.*';

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2013-08-14
              • 2016-07-18
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多