MySQL CONCAT, HAVING и JOIN

  • Автор темы akelevra
  • 51
  • Обновлено
  • 12, May 2024
  • #1
Привет, можно ли это использовать все вместе?

вот мой запрос:

SELECT CONCAT(полное имя," ",адрес1," ",город," ",штат," ",zip," ",имя," ",фамилия," ",электронная почта," ",услышать о нас," ",домашний телефон, " ",рабочий телефон", ",мобильный телефон) AS поисковый запрос

ОТ рефералов

Адрес ВНУТРЕННЕГО СОЕДИНЕНИЯ ON адрес.clientid=referrals.clientid

ГДЕ Referrals.firstname не равно нулю И адрес.prim=1

ИМЕЕТ поисковый запрос LIKE '%{$term}%'

На консоли я получаю сообщение об ошибке «[Err] 1054 — Неизвестный столбец «адрес 1» в «списке полей»»

это означает, что таблица адресов не распознается с помощью JOIN

Можете ли вы помочь мне с этим? Спасибо

akelevra


Рег
03 May, 2012

Тем
1

Постов
2

Баллов
12
  • 12, Jun 2024
  • #2
Вероятно, нам нужно отдельно поговорить о том, почему вы используете 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}%' )";
Код (разметка):
 

syltan02091989


Рег
05 Dec, 2015

Тем
1

Постов
3

Баллов
13
  • 12, Jun 2024
  • #3
Привет, Я использую concat, join и HAVING, потому что хочу выполнить поиск в двух разных таблицах по ключевому слову, отправленному через форму, с использованием автозаполнения. поэтому, когда я набираю любое имя, адрес или номер телефона в поле автозаполнения, он выполняет поиск по таблице адресов и рефералов по этому ключевому слову. С другой стороны, я использую «HAVING» из-за псевдонима, заданного в операторе CONCAT. Спасибо.
 

aqua_phoenix


Рег
01 Jan, 2011

Тем
0

Постов
2

Баллов
2
Тем
49554
Комментарии
57426
Опыт
552966

Интересно