【问题标题】:How to write MySQL query where A contains ( "a" or "b" )如何编写 A 包含的 MySQL 查询(“a”或“b”)
【发布时间】:2011-09-01 13:45:21
【问题描述】:

我必须使用这种格式where A operand B。 A是场;我希望 B 是 "text 1" 或 "text 2",所以如果 A 有像 "text 1 texttext" 或 "texttext 2" 这样的数据,查询就会有结果。

但是我该怎么写呢? MySQL是否支持类似的东西

where A contains ('text 1' OR 'text 2')? `

【问题讨论】:

    标签: mysql


    【解决方案1】:

    两种选择:

    1. 使用 LIKE 关键字以及字符串中的百分号

      select * from table where field like '%a%' or field like '%b%'.
      

      (注意:如果您的搜索字符串包含百分号,则需要对其进行转义)

    2. 如果您正在寻找比示例中指定的更复杂的字符串组合,您可以使用正则表达式 (regex):

      有关如何使用它们的更多信息,请参阅 MySQL 手册:http://dev.mysql.com/doc/refman/5.1/en/regexp.html

    其中,使用LIKE 是最常用的解决方案——它是标准SQL,并且是常用的。正则表达式不太常用,但功能强大得多。

    请注意,无论您使用哪种选项,您都需要了解可能的性能影响。像这样搜索子字符串意味着查询必须扫描整个表。如果您有一个大表,这可能会导致查询速度非常慢,而且再多的索引也无济于事。

    如果这对您来说是个问题,并且您需要一遍又一遍地搜索相同的内容,您可能更愿意执行类似的操作,例如在表中添加一个标志字段,指定字符串字段包含相关子串。如果您在插入或更新记录时保持此标志字段是最新的,您可以在想要搜索时简单地查询该标志。这可以被索引,并使您的查询更快。是否值得为此付出努力取决于您,这取决于使用 LIKE 时的性能有多差。

    【讨论】:

    • 在使用“或”语句时要小心。最好在它们周围使用括号,例如select * from table where (field like '%a%' or field like '%b%')。如果您有其他 AND 子句,您的查询可能会像 SELECT * FROM TABLE WHERE (A = 1 AND B =2 AND C = 3) OR (D =4) 一样,这通常不是您想要的。
    • 就我而言,鉴于问题对 A 和 B 的使用,如果您说 %text 1% 而不是 %a% 会更清楚
    【解决方案2】:

    你可以这样写你的查询:

    SELECT * FROM MyTable WHERE (A LIKE '%text1%' OR A LIKE '%text2%')
    

    % 是一个通配符,这意味着它会搜索 A 列包含 text1text2

    的所有行

    【讨论】:

    • 但我必须使用 A operand B 格式。由于编程,这实际上是我必须使用的所有 3 个变量
    • 老实说,我不确定这是否可能在您的限制范围内......当我们比较两种完全不同的模式时,我们应该分别比较它们,并且布尔值 OR 存在以便我们可以做这。我不知道有任何 MySQL 比较允许我们只用一个运算符对两种模式中的任何一种进行比较。
    【解决方案3】:

    我大部分时间都使用 LIKE 选项,它工作得很好。 我只想分享我使用 INSTR 函数的最新经验之一。不管是什么原因让我考虑这个选项,这里重要的是用途是相似的: instr(A, 'text 1') > 0 或 instr(A, 'text 2') > 0 另一种选择可能是: (instr(A, '文本 1') + instr(A, '文本 2')) > 0

    我会选择 LIKE '%text1%' OR LIKE '%text2%' 选项...如果不是希望这个其他选项有帮助

    【讨论】:

      【解决方案4】:

      我是搜索摩托车尺寸的用户:

      例如: Data = "轮胎循环尺寸 70 / 90 - 16"

      我可以用“70 90 16”搜索

      $searchTerms = preg_split("/[\s,-\/?!]+/", $itemName);
      
      foreach ($searchTerms as $term) {
              $term = trim($term);
                  if (!empty($term)) {
                  $searchTermBits[] = "name LIKE '%$term%'";
                  }
              }
      
      $query = "SELECT * FROM item WHERE " .implode(' AND ', $searchTermBits);
      

      【讨论】:

      • 我觉得应该是OR
      猜你喜欢
      • 1970-01-01
      • 2017-01-21
      • 2013-05-26
      • 1970-01-01
      • 2018-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多