【发布时间】: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 系统地导致表扫描!