我在mySQL中连接生成了一个可以搜索的字段。它包含客户数据库的动物以及所有者名称和地址。我需要能够搜索动物名称,业主名称和邮政编码在任何顺序。
因此,如果我的名字是约翰·史密斯,我养了一只名叫菲多的狗,住在邮政编码AB12的D,如果输入以下任何一项,我希望搜索得到结果:
“约翰·菲多AB1”
“约翰AB1”
“AB1约翰”
“AB1菲多”
“菲多2CD”
“2立方厘米”
“菲多”
等。。。也就是说,任何顺序的字段,也不完整的单词,所以“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”,因为它在连接字段中无序。
非常感谢任何帮助

最佳答案

我认为您必须拆分关键字并为关键字字符串中的每个关键字添加一个查询。
因此,首先(在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%'";

但是请注意,对于您在日常操作中可能遇到的表的大小来说,这不会很快。您可能希望寻找一种更好的全文搜索方式,无论是使用库还是创建由触发器维护的关键字交叉引用表。

关于php - 在“连接的字段”中以任意顺序过滤多个单词的mySQL数据库,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2323010/

10-09 20:15