簡體   English   中英

棘手的SQL進行智能搜索

[英]Tricky SQL for a smart search

我正在通過PHP CMS系統使用一種表單,該表單定義了自定義字段等。

自定義字段之一允許進行智能搜索的輸入字段。 這意味着當您開始鍵入內容時,它會顯示匹配的記錄,與Google建議非常相似。

smartsearch輸入字段依賴於存儲的mysql搜索,這就是我遇到的麻煩,因為它看起來太復雜了。

我將粘貼現有搜索中的SQl,然后解釋我要做什么。

幾列中有不同的sql查詢,如下所示:

從句

((`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`)

顯示字段:

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')

類場

clients.type

搜索域

clients.company, clients.firstname, clients.lastname

過濾子句

clients.inactive=0

我無法理解這些查詢的實際工作方式。 displayfield和secondaryfield似乎非常多余。

我認為我的需求與當前示例smartsearch字段的工作方式沒有什么不同...只是我想要的客人不是我想要的客人,而不是地址,我只是希望它匹配名字,姓氏或護照號碼。

我想知道在這種情況下我是否還需要secondaryfield?

特別是,fromclause中的內部聯接使我感到困惑,因為我不需要這樣做,因為所有來賓信息都在一個表中...

非常感謝您在這里的任何幫助。

我用一些縮進重新格式化了代碼示例,以便於閱讀。 它們很長,並且水平滾動,很難說出正在發生什么。

這樣的事情似乎無能為力:

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

我猜想它是由不了解NULL在SQL中如何工作的人或習慣於Oracle的人編寫的,其中NULL和''是等效的。

Displayfield和Secondaryfield具有不同的內容。 Displayfield顯示人員的公司和名稱,secondaryfield顯示人員的地址,州和郵政編碼。 這些不是多余的。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM