繁体   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