Вероятно, нам нужно отдельно поговорить о том, почему вы используете concat.
Я подозреваю (скажите мне, если я ошибаюсь), что на самом деле он жалуется на то, что не знает, что вы имеете в виду, когда говорите «адрес1», поскольку это есть как в таблицах ссылок, так и в таблицах адресов?
Давайте переработаем ваш запрос.
Вы хотите знать, находится ли $term в каком-либо из этих полей.
select Membership.name,
CASE
WHEN `Membership`.`name` = "smith"
THEN 4
ELSE 0
END +
CASE
WHEN `Membership`.`name` LIKE "%smith%"
THEN 2
ELSE 0
END +
CASE
WHEN `Individual`.`lastname` LIKE "%smith%"
THEN 2
ELSE 0
END +
CASE
WHEN `Membership`.`postal1` = '4 oaktree lane'
THEN 2
ELSE 0
END +
CASE
WHEN `Individual`.`email` = '[email protected]'
THEN 4
ELSE 0
END
) AS `relevance`
from Membership
left join Individual on Membership.id = Individual.membershipId
where ...
order by relevance
Код (разметка): а затем вы можете делать интересные вещи в порядке, чтобы лучшее совпадение оказалось в верхней части списка.
Теперь в моем коде я разделил все тесты, и на одном из моих клиентских сайтов есть нечто подобное, но у меня нет для всех них отметки «нравится» – столбцы, подобные электронной почте, на которых я настаиваю.
дано полностью.
Я бы сделал то же самое и с телефонными номерами.
Это может изменить ваш запрос на это, что будет быстрее:
$sql = "SELECT referral.id FROM referrals INNER JOIN address ON address.clientid = referrals.clientid WHERE referrals.firstname IS NOT NULL AND address.prim = 1 AND (referral.fullname LIKE '%{$term}%' OR referral.firstname LIKE '%{$term}%' OR referral.lastname LIKE '%{$term}%' OR referral.email = '{$term}' OR referral.hearaboutus LIKE '%{$term}%' OR address.address1 LIKE '%{$term}%' OR address.city LIKE '%{$term}%' OR address.state LIKE '%{$term}%' OR address.zip LIKE '%{$term}%' OR address.homephone = '{$term}' OR address.workphone = '{$term}' OR address.cellphone= '{$term}' )";
Код (разметка): я просто привел вам код в качестве примера.
Каждый раз, когда я провожу тест, я придаю результату значение.
Если имя точно совпадает, они получают 4 балла.
Если совпадение неточное, они получают 2 очка.
Если имя человека совпадает, он получает еще 2 балла, а если адрес точно совпадает, он получает еще 2, то же самое с электронной почтой.
Теперь вы можете использовать свои собственные правила, чтобы решить, сколько очков и за что, но если вы находитесь в ситуации, когда может быть возвращено более одной записи, то «взвешивание» — действительно хорошая идея.
$sql = "SELECT referral.id FROM referrals INNER JOIN address ON address.clientid = referrals.clientid WHERE referrals.firstname IS NOT NULL AND address.prim = 1 AND (referral.fullname LIKE '%{$term}%' OR referral.firstname LIKE '%{$term}%' OR referral.lastname LIKE '%{$term}%' OR referral.email LIKE '%{$term}%' OR referral.hearaboutus LIKE '%{$term}%' OR address.address1 LIKE '%{$term}%' OR address.city LIKE '%{$term}%' OR address.state LIKE '%{$term}%' OR address.zip LIKE '%{$term}%' OR address.homephone LIKE '%{$term}%' OR address.workphone LIKE '%{$term}%' OR address.cellphone LIKE '%{$term}%' )";
Код (разметка):