2010-06-30 96 views
2

我通過PHP CMS系統使用表單來定義自定義字段等。智能搜索的棘手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 

我無法理解這些查詢是如何工作的。顯示字段和次字段看起來非常多餘。

我不認爲我的需求與目前的智能搜索領域的工作原理是如此不同......而不是客戶我想客人,而不是地址,我只是希望它匹配名字,姓氏或護照號碼。

我想知道在這種情況下我是否需要次中場?

特別是,內中fromclause加入混淆了我,因爲我不認爲我需要做的,因爲所有的客戶信息是在一個表...

這裏的任何幫助是非常讚賞,謝謝。

+0

你能提供整個查詢作爲一個塊,所以我們可以看到什麼是實際正在查詢從數據庫? – bpeterson76 2010-06-30 17:53:52

+0

我該怎麼做?我不認爲我可以......我認爲智能搜索字段根據輸入內容做了不同的查詢。 – Jacob 2010-06-30 17:56:25

回答

0

我重新格式化了您的代碼樣本並進行了一些縮進處理,因此它更易於閱讀。他們很長,水平滾動,很難說出發生了什麼。

像這樣的事情顯得無可奈何:

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

我猜想,它是由人誰沒有在SQL瞭解NULL的作品,或誰是習慣了甲骨文,其中NULL和' '是等同的。

顯示字段和輔助字段有不同的內容。 Displayfield顯示該人的公司和名稱,而Secondaryfield顯示該人的地址,州和郵政編碼。這些不是多餘的。

複雜性來自嘗試處理空白或未指定的內容。

+0

謝謝您的重新格式化。 該代碼確實可以工作,並被設計爲與MySQL一起工作。 我認爲它與此有關,因爲它是一個智能搜索,我發佈的並不是整個查詢,而是查詢將從我所測試的部分內容和部分我在該字段中鍵入的內容我輸入它。 不幸的是,我無法找到任何文檔並找出它,並且我的工作有些失明。 關於如何確定實際對數據庫進行的查詢,您有任何建議嗎?可以配置mysql來記錄所有查詢嗎? – Jacob 2010-06-30 18:29:16

+0

我同意使用'IFNULL(addresses.city,'''而不是'IF(addresses.city!='',addresses.city,'')''來避免一些不必要的複雜性,例如 – laurent 2010-06-30 19:57:13

+1

@Jacob:我想你是對的,可能smartsearch系統使用和修改這些部分的查詢來根據表單上的答案/選項來構建一個查詢,這就是爲什麼有這麼多的選項似乎是不必要的,它們可以根據要搜索mysql查詢,你可以在'/ etc/my.cnf'中插入: '[mysqld]'section:'log =/tmp/mysql.log' mysql需要權限來創建和寫入文件。它只對mysql可讀,因爲它會記錄所有的查詢,包括密碼,並且只在開發時使用它,因爲它會很快變得很大 – laurent 2010-06-30 20:07:34