2010-06-30 3 views
2

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

Одно из настраиваемых полей позволяет ввести поле ввода, которое выполняет интеллектуальный поиск. Это означает, что когда вы начинаете вводить текст, он показывает записи, которые соответствуют, очень похожие на 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 

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

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

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

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

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

+0

Вы могли бы предоставить весь запрос в виде блока, чтобы мы могли видеть, что на самом деле запрашивается из БД? – bpeterson76

+0

как бы я это сделал? Я не думаю, что могу ... Я думаю, что поле smartsearch выполняет разные запросы в зависимости от того, что напечатано .... – Jacob

ответ

0

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

Нечто подобное, кажется, не делать ничего:

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

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

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

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

+0

Спасибо за переформатирование. Код определенно работает, и был разработан для работы с MySQL. Я думаю, что это имеет какое-то отношение к этому, поскольку это smartsearch, то, что я опубликовал, - это не весь запрос, скорее запрос будет сделан из части того, что я использовал, и части того, что я набираю в поле, Я печатаю его. К сожалению, у меня возникли проблемы с поиском документации и выяснением этого, и я несколько ослеп. Есть ли у вас какие-либо предложения о том, как я могу выяснить, какие запросы фактически выполняются в базе данных? Можно ли настроить mysql для регистрации всех запросов? – Jacob

+0

Я согласен с тем, что некоторая непростая сложность можно было бы избежать, используя 'IFNULL (addresses.city, ''' вместо 'IF (addresses.city! = '', Addresses.city, '')' например. – laurent

+1

@Jacob: Я думаю вы правы, возможно, система smartsearch использует и модифицирует эти части запросов для создания на основе ответов/вариантов формы. Поэтому существует так много вариантов, которые кажутся ненужными. Они могут использоваться в зависимости от выбора для поиск. Для регистрации запросов mysql вы можете вставить в '/ etc/my.cnf': ' [mysqld] 'раздел:' log =/tmp/mysql.log' mysql нуждается в правах для создания и записи в файл Сделайте его доступным только для чтения в mysql, поскольку он будет регистрировать ВСЕ запросы, включая пароли, и использовать его только во время разработки, отладки, так как он быстро станет очень быстрым. – laurent

Смежные вопросы