Лучший способ приблизительного поиска соответствия в 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 = "[email protected]";

Предполагая, что есть 0 полных совпадений, как мне написать запрос, который мог бы видеть частичные совпадения, а затем возвращать результаты, упорядоченные по количеству совпадений?

Например, используя мои данные примера, я мог бы ожидать, что результат будет выглядеть примерно так:

username | name | address        | phone    | email               | matches
----------------------------------------------------------------------------
john123  | john | 12 new street  | 23456789 | [email protected] | 4
tim123   | tim  | 10 fake street | 23456789 | [email protected]   | 2

Просто чтобы заметить, я не ищу поиск по шаблону здесь. Я хочу вернуть результаты, которые имеют точные совпадения, но не обязательно полное совпадение, используя все поля БД. А также хочу расставить приоритеты по количеству совпадений.

Я могу подумать об очень неэффективном способе сделать это, запустив каждый отдельный запрос, загрузив его в массив PHP и посчитав, какие идентификаторы найдены в большинстве массивов. Тем не менее, база данных, в которой выполняется это, имеет миллионы записей на таблицу, так что это вообще невозможно.

0

Решение

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
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]