Я ищу эффективный способ сделать следующий поиск в 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 и посчитав, какие идентификаторы найдены в большинстве массивов. Тем не менее, база данных, в которой выполняется это, имеет миллионы записей на таблицу, так что это вообще невозможно.
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
Других решений пока нет …