在 MySQL/PHP 中进行近似搜索匹配的最佳方法?
Best way to go about approximate search matching in MySQL/PHP?
我正在寻找一种有效的方法来在 MySQL/PHP...
中进行以下搜索
假设我的数据库中有许多字段我想搜索:
User.username
Name.first_name
Address.line1
Phone.number
Email.email_address
我在 PHP 中还有以下变量(带有示例数据)可供搜索:
$username = "john123";
$name = "john";
$address = "10 fake street";
$phone = "23456789";
$email = "john@johnsemail.com";
假设有 0 个完全匹配项,我将如何编写一个可以看到部分匹配项然后 return 结果按匹配项数排序的查询?
例如,使用我的示例数据,我可能希望看到这样的结果,
username | name | address | phone | email | matches
----------------------------------------------------------------------------
john123 | john | 12 new street | 23456789 | john@johnsemail.com | 4
tim123 | tim | 10 fake street | 23456789 | tim@timsemail.com | 2
请注意,我不是在寻找通配符搜索。我想要 return 具有完全匹配的结果,但不一定是使用所有数据库字段的完全匹配。并且还想按匹配次数对结果进行优先排序。
我可以想到一种非常低效的方法,即 运行 每个作为单独的查询,将其加载到 PHP 数组中,然后计算在最多数组中找到的 ID。但是,数据库 运行 每个 table 有数百万条记录,所以这根本不可行。
SELECT *,
if (username = '$username', 1, 0) +
if (name = '$name' , 1, 0) +
if (phone = '$phone' , 1, 0) +
if (address = '$address' , 1, 0) AS matches
FROM tab
ORDER BY matches DESC
我正在寻找一种有效的方法来在 MySQL/PHP...
中进行以下搜索假设我的数据库中有许多字段我想搜索:
User.username
Name.first_name
Address.line1
Phone.number
Email.email_address
我在 PHP 中还有以下变量(带有示例数据)可供搜索:
$username = "john123";
$name = "john";
$address = "10 fake street";
$phone = "23456789";
$email = "john@johnsemail.com";
假设有 0 个完全匹配项,我将如何编写一个可以看到部分匹配项然后 return 结果按匹配项数排序的查询?
例如,使用我的示例数据,我可能希望看到这样的结果,
username | name | address | phone | email | matches
----------------------------------------------------------------------------
john123 | john | 12 new street | 23456789 | john@johnsemail.com | 4
tim123 | tim | 10 fake street | 23456789 | tim@timsemail.com | 2
请注意,我不是在寻找通配符搜索。我想要 return 具有完全匹配的结果,但不一定是使用所有数据库字段的完全匹配。并且还想按匹配次数对结果进行优先排序。
我可以想到一种非常低效的方法,即 运行 每个作为单独的查询,将其加载到 PHP 数组中,然后计算在最多数组中找到的 ID。但是,数据库 运行 每个 table 有数百万条记录,所以这根本不可行。
SELECT *,
if (username = '$username', 1, 0) +
if (name = '$name' , 1, 0) +
if (phone = '$phone' , 1, 0) +
if (address = '$address' , 1, 0) AS matches
FROM tab
ORDER BY matches DESC