【问题标题】:Where field1 + field2 + field3 LIKE "%my_own_string%"?哪里 field1 + field2 + field3 LIKE "%my_own_string%"?
【发布时间】:2011-11-05 21:36:48
【问题描述】:

我有一个字符串,比如Elton 1999,还有一个包含 4 个字段的 MySql 表:

table(id, name, surname, year)

我必须检查,将这些字段作为“单个字段”加入,它是否包含我的字符串的所有单词。

我的意思是:

1 Elton John 1999 -> 必须返回记录 2 Elton Peter 1999 -> 必须返回记录 3 Paris Elton 1999 -> 必须返回记录 4 Elto John 1999 -> 不得归还记录 5 Elton Pierre 2000 -> 不得归还记录

我可以直接使用 MySql 还是我需要先获取所有记录然后在服务器端解析它们? (就我而言,在 PHP 上)

附:如果我的字符串是 1999 Elton,则必须以相同的结果开头,所以我的单词顺序无关紧要...

【问题讨论】:

    标签: php mysql


    【解决方案1】:
    SELECT * FROM myTbl WHERE CONCAT(name, surname, year) LIKE '%ELTON%1999'
    

    SELECT * FROM myTbl WHERE CONCAT_WS(' ', name, surname, year) LIKE '%ELTON%1999'
    

    在每个字段之间添加一个空格。感谢神奇的兔子。

    更新:好吧,如果您想在具有任意顺序的值字符串的任何列上搜索可能的匹配项,那么您可以按空格分解您的字符串并单独搜索每个单词。看看这是否有效

    $query = "SELECT * FROM myTbl";
    if(!empty($searchString)){
      $query .= " WHERE ";
      $arr = explode(' ', $searchString);
      foreach($arr as $word)
        $fields[] = "CONCAT_WS(' ', name, surname, year) LIKE %$word%";
      $query .= implode(" AND ", $fields);
    }
    

    PS - 我最近从 @yahyaE here 学到了这种查询构建技术:)

    【讨论】:

    • @markzzz o.O 你不应该使用CONCAT(name, surname, year) 得到它。这一年应该永远在最后。
    • 是的!但是,如果我搜索“1999 Elton”(这是我的搜索字符串),我会考虑获取记录......使用你的解决方案这不起作用......
    【解决方案2】:

    只要您的输入字符串格式一致,您应该能够使用 CONCAT_WS() 将字段连接在一起,并在查询时将它们与您的输入字符串进行比较。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-05
      • 1970-01-01
      • 2010-11-28
      相关资源
      最近更新 更多