【问题标题】:filter mySQL database with multiple words in any order in Concatenated field在 Concatenated 字段中以任意顺序过滤具有多个单词的 mySQL 数据库
【发布时间】:2011-01-20 08:22:39
【问题描述】:

我在 mySQL 中进行了连接以生成一个可以搜索的字段。这包含客户数据库的动物以及所有者名称和地址。我需要能够按任何顺序按动物名称、所有者姓名和邮政编码进行搜索。 因此,如果我的名字是 john smith,并且我拥有一只名叫 Fido 的狗,并且居住在邮政编码 AB1 2CD 中,那么如果输入以下任何一项,我希望搜索能够产生结果:

“约翰·菲多 AB1” “约翰 AB1” “AB1 约翰” “AB1 菲多” 《菲多2CD》 《2CD》 “菲多” 等等......即任何顺序的任何字段,也不是完整的单词,所以“john fido AB1”应该产生与“jo fi AB1”相同的结果

我目前有这个 PHP 代码,在我的搜索页面上获取一个文本字段,爆炸然后将其内爆以在搜索词之间添加 %:

$list = explode(' ',$_GET["q"]);  
$q = implode('%%', $list);
if (!$q) return;  
$sql = "SELECT DISTINCT owner.AddressPrim, owner.PostcodePrim, 
owner.OwnerSurnamePrim,owner.OwnerForenamesPrim,owner.OwnerID
FROM owner
Inner Join patient ON owner.OwnerID = patient.OwnerID
WHERE CONCAT_WS(' ',owner.AddressPrim, owner.PostcodePrim,
owner.OwnerForenamesPrim,owner.OwnerSurnamePrim,patient.AnimalName) LIKE '%$q%'";

这适用于“AB1 john”和“john fido”,但不适用于“fido john”,因为它在连接字段中是无序的。

非常感谢任何帮助

【问题讨论】:

  • 多么糟糕的想法...这个前端+端通配符谓词以及 CONCAT_WS 系统地导致表扫描!

标签: php select mysql sql-like


【解决方案1】:

我认为您将不得不拆分关键字并为关键字字符串中的每个关键字添加一个查询。

首先(在 PHP 中)拆分查询字符串并动态生成 SQL 查询,然后将其发送到数据库。这里有一些伪代码来告诉你我的意思:

$keywords = explode(' ', $q);
$sql = "SELECT DISTINCT owner.AddressPrim, owner.PostcodePrim, 
    owner.OwnerSurnamePrim,owner.OwnerForenamesPrim,
    owner.OwnerID

    FROM owner 
    Inner Join patient ON owner.OwnerID = patient.OwnerID";

$first = true;

foreach($keyword in $keywords):
    if($first):
        $sql += " WHERE ";
        $first = false;
    else:
        $sql += " AND ";

    $escaped = mysql_real_escape_string($keyword);
    $sql += " CONCAT_WS(' ',owner.AddressPrim, owner.PostcodePrim,
        owner.OwnerForenamesPrim,owner.OwnerSurnamePrim,patient.AnimalName) 
        LIKE '%$escaped%'";

但请注意,对于您在日常操作中可能会遇到的表的大小,这不会接近快。您可能想研究一种更好的全文搜索方法,无论是使用库还是制作由触发器维护的关键字的交叉引用表。

【讨论】:

    【解决方案2】:

    MySQL 的全文搜索(仅限 MyISAM 表!)可能对您有用。

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

    【讨论】:

      【解决方案3】:

      你可以试试这个http://www.sphinxsearch.com/

      你需要专门的服务器来运行这个东西,但是如果你有一台,sphinx 会很容易地解决你的问题并且你的查询不会加载数据库。

      【讨论】:

        猜你喜欢
        • 2016-12-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-05-15
        • 2017-12-22
        • 1970-01-01
        相关资源
        最近更新 更多