【问题标题】:MySQL: Query to Search All possible wordsMySQL:查询以搜索所有可能的单词
【发布时间】:2011-10-13 09:59:08
【问题描述】:

我有一个带有输入框的表单,用户可以在其中指定他们的姓名,姓名可以是两个或多个单词,例如John SmithJohn Michael Smith

我需要编写一个查询,该查询将返回包含提交名称中所有单词的记录。因此查询将返回包含所有这些名称但顺序不同的记录。

例如,如果搜索字符串是John Michael Smith,则查询应该能够返回名称为John Smith MichaelMichael Smith JohnSmith John Michael 或所有这些单词的其他组合的记录。可以看出,仅返回名称字段中仍然包含所有单词但可以具有不同顺序的记录。但是,它不应返回不包含名称部分的结果,例如不应返回 John Michael,因为它缺少 Smith

我不知道如何为我的这种要求编写查询。请帮忙。


更新

到目前为止提供的答案甚至返回匹配John Michael 的记录。我尝试了@Marco@abesto@Eddie 的答案。

问题依然存在:(

【问题讨论】:

    标签: php mysql sql


    【解决方案1】:

    您可以尝试全文搜索:

    SELECT * FROM table WHERE MATCH (name)
    AGAINST ('+part1 +part2 +part3' IN BOOLEAN MODE);
    

    在这个解决方案中,'+part1 +part2 +part3' 将在 PHP 中生成。

    the MySQL docs

    mysql> select * from sof;
    +--------------------+
    | n                  |
    +--------------------+
    | John               |
    | Smith              |
    | Smith John         |
    | Smith John Michael |
    | John               |
    +--------------------+
    5 rows in set (0.00 sec)
    
    mysql> SELECT * FROM sof WHERE MATCH(n) AGAINST('+John +Smith +Michael' IN BOOLEAN MODE);
    +--------------------+
    | n                  |
    +--------------------+
    | Smith John Michael |
    +--------------------+
    1 row in set (0.00 sec)
    

    【讨论】:

    • 结果还包括 'John Michael' :(
    • 他们绝对不应该这样做。查看更新以进行测试运行。
    【解决方案2】:

    您可以使用这样的查询:

    SELECT * FROM your_table
    WHERE 
        name LIKE '%John%' AND 
        name LIKE '%Michael%' AND 
        name LIKE '%Smith%'      
    

    显然WHERE 部分必须使用用户输入动态构建。
    有些地方可能是错误的,但您必须做出决定:如果列包含类似 "Michael Smith Johnas" 之类的内容,则返回此记录。

    【讨论】:

    • 您的查询指定了特定的顺序,例如约翰第一迈克尔第二和史密斯第三。所以我想知道它是否也适用于这三个词的不同顺序?
    • 是的,它确实适用于不同的顺序 - 名称 Michael John Smith 与 John Smith Michael 一样适合 where 子句,因为通配符 '%' 在名称之前和之后。但是,正如@Marco 指出的那样,您还将获得 Michaels、Johnas 等名称的结果。
    • 结果还包括 'John Michael' :(
    • @Dev555:不,它没有。我刚刚尝试过,我的查询没有选择该记录!!!
    • 这是我尝试过的方法,但正如我所说,它还返回 John Michael: SELECT id, name FROM users WHERE name LIKE '%Michael%' && name LIKE '%Smith%' && name LIKE '%John%'
    【解决方案3】:

    这很容易,伙计。

    $keyword=$_POST['keyword'];
    $keywords=explode(' ',$keyword);
    for($i=0;$i<count($keywords);$i++)
    $where .= ($i ? ' and ' : ' where ')."`name` like '%{$keywords[$i]}% '";
    $q="select * from $table ".$where;
    $rs=mysql_query($q);
    

    【讨论】:

      【解决方案4】:
      $name=$_POST['name'];  //save the search query in a variable
      $query = "SELECT * FROM names WHERE name like %$name%";
      

      【讨论】:

      • 如果搜索查询将包含多个姓名,请使用上述@eddie 的答案...
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多