【问题标题】:MySQL Searching forename and surnameMySQL搜索名字和姓氏
【发布时间】:2013-01-14 07:53:19
【问题描述】:

好的,我有一个名为players 的数据库表,每个玩家都有一个名字和姓氏。然后我有一个 PHP Ajax 搜索工具,我调用它来搜索玩家。例如……在输入框中,有人输入James,表格中有一行姓名分别为JamesSmith

我这样做$check = mysql_query("SELECT * FROMplayersWHEREsurnameLIKE '%$name%' ORforenameLIKE '%$name%' LIMIT 0, 10") or die(mysql_error());

它返回至少 10 个名字或姓氏 like 关键字 James。但是,如果我输入James Smith,尽管它在表格中,我得到的结果为零。

我该如何解决这个问题?

【问题讨论】:

    标签: php mysql ajax


    【解决方案1】:
    SELECT * FROM players WHERE CONCAT(forename, ' ', surname) = '$name' OR forename LIKE '%$name%' OR surname LIKE '%$name%'
    

    【讨论】:

    • 这很好。谢谢你。但是,它似乎只有在我输入 John Smith... 时才有效,因为(因为我正在执行 ajax 搜索和按键操作)搜索 John Smi 返回 0...
    • 然后点个赞:CONCAT(forename, ' ', surname) LIKE '%$name%'。或者,为了更好的数据库性能,CONCAT(forename, ' ', surname) LIKE '$name%'(假设您正在使用索引)
    【解决方案2】:

    您使用的是 InnoDB 还是 MyISAM?如果您使用 MyISAM,您可以创建一个包含组合名称的字段,然后使用全文索引对其进行搜索。因此,假设您添加了一个名为 combined_names 的新字段,您会像这样搜索它

    SELECT * FROM table WHERE match(combined_names) against('John Smith');
    

    这将找到任何包含 John 或 Smith 的行,您可以将其更改为仅匹配那些包含两个部分的行,您将像这样添加加号:

    SELECT * FROM table WHERE match(combined_names) against('+John +Smith');
    

    这里是 MySQL 网站上的文档,您可以在其中找到更多信息:

    http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html

    【讨论】:

    • 但是..字段combined_names不需要里面有数据来搜索吗?
    • 嗯,是的,您需要在代码或触发器中填充它。这是否重复数据......是的,但有时重复数据是获得搜索性能的最佳方式。您可以使用其他代码解决方案来拆分字符串并执行一些 ors 等操作,您的应用程序中有固定数量的复杂性,您可以选择放在哪里:)。
    • 问题@Scott Neville...它为什么只适用于较长的文本?我尝试从Gao Lin 搜索Gao Li,但它没有用..当其他(更长的)名称确实有效时..
    • 抱歉这么久才回复。 MySQL 有一些配置参数来控制全文搜索,它们是: ft_min_word_len - 默认情况下是 4,这意味着只有超过 4 个字符的单词可以搜索,在 my.cnf 中更改它(如果你改变它你将需要重建索引,最简单的方法是删除并重新创建它)。另一个是停用词,您可以在这里找到更多信息dev.mysql.com/doc/refman/5.0/en/fulltext-stopwords.html
    【解决方案3】:

    将名称拆分为空格,以便查询运行两次(如果有一个空格)

    查询将针对两个名称运行

    $nameBits = explode($name," ");
    

    为每个 $nameBits 运行查询

    surname LIKE '%$nameBits[$i]%' 
    

    【讨论】:

      猜你喜欢
      • 2011-08-19
      • 1970-01-01
      • 1970-01-01
      • 2012-02-19
      • 1970-01-01
      • 2023-03-19
      • 2021-07-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多