Хитрый SQL для умного поиска - PullRequest
2 голосов
/ 30 июня 2010

Я использую форму через систему PHP CMS, которая определяет настраиваемые поля и тому подобное.

В одном из настраиваемых полей предусмотрено поле ввода, которое выполняет интеллектуальный поиск. Это означает, что когда вы начинаете печатать, на нем отображаются записи, которые очень похожи на предложения Google.

Поле ввода smartsearch основано на сохраненном поиске mysql, и это то, с чем у меня проблемы, потому что оно выглядит слишком сложным.

Я собираюсь вставить SQl из существующего поиска, а затем объяснить, что я пытаюсь сделать.

В нескольких столбцах имеются различные sql-запросы:

fromclause

((`clients` INNER JOIN `addresstorecord` 
    ON `clients`.`uuid` = `addresstorecord`.`recordid` 
    AND `addresstorecord`.`tabledefid`='tbld:6d290174-8b73-e199-fe6c-bcf3d4b61083' 
    AND addresstorecord.primary='1') 
INNER JOIN `addresses` ON `addresstorecord`.`addressid` = `addresses`.`uuid`)

displayfield:

IF(clients.company != '', 
   CONCAT(clients.company,
          IF(clients.lastname != '' OR clients.firstname != '', 
             CONCAT(' (',
                    IF(clients.lastname != '', clients.lastname, '{blank}'),
                    ', ',
                    IF(clients.firstname != '', clients.firstname, '{blank}'),
                    ')'),
             '')
          ),
   IF(clients.lastname != '' OR clients.firstname != '',
      CONCAT(IF(clients.lastname != '', clients.lastname, '{blank}'),
             ', ',
             IF(clients.firstname != '', clients.firstname, '{blank}')),
      ''))
)

secondaryfield:

IF(addresses.city != '' OR addresses.state !='' OR addresses.postalcode != '',
  CONCAT(IF(addresses.city != '', addresses.city, ''),
         ', ',
         IF(addresses.state != '', addresses.state, ''),
         ' ',
         IF(addresses.postalcode != '', addresses.postalcode, '')),
  'unspecified location')

classfield

clients.type

searchfields

clients.company, clients.firstname, clients.lastname

filterclause

clients.inactive=0

У меня проблемы с пониманием того, как на самом деле работают эти запросы. Поле дисплея и вторичное поле, в частности, кажутся очень избыточными.

Я не думаю, что мои потребности настолько отличаются от того, как работает текущий пример поля smartsearch ... просто вместо клиентов мне нужны гости, а вместо адреса я просто хочу, чтобы они соответствовали имени, фамилии или номеру паспорта.

Интересно, мне вообще нужно вторичное поле в этом случае?

В частности, внутреннее соединение в предложении from вводит меня в заблуждение, так как я не думаю, что мне нужно это делать, поскольку вся информация о гостях находится в одной таблице ...

Любая помощь здесь очень ценится, спасибо.

1 Ответ

0 голосов
/ 30 июня 2010

Я переформатировал примеры кода с некоторыми отступами, чтобы их было легче читать.Они были очень длинными и прокручивались горизонтально, трудно сказать, что происходит.

Что-то вроде этого, похоже, ничего не делает:

IF(addresses.state != '', addresses.state, '')

Я думаю, это было написано кем-то, ктопонять, как NULL работает в SQL, или кто-то, кто привык к Oracle, где NULL и '' эквивалентны.

Поле отображения и вторичное поле имеют различное содержимое.Поле отображения показывает компанию и имя человека, в то время как вторичное поле показывает адрес, штат и почтовый индекс человека.Они не являются избыточными.

Сложность заключается в попытке обработать пустой или неопределенный контент.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...