我正在通过一个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}')),
      ''))
)

二级字段:
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字段的工作方式有太大的不同…只是我不希望客户是我想要的客人,而不是地址,我只希望它与名字、姓氏或护照号码匹配。
我想知道在那种情况下我是否需要第二个字段?
尤其是fromClause中的内部连接让我感到困惑,因为我不认为我需要这样做,因为所有的来宾信息都在一个表中…
非常感谢您的帮助,谢谢。

最佳答案

我用缩进重新格式化了您的代码示例,这样更容易阅读。它们很长,水平滚动,很难说是怎么回事。
像这样的事情似乎什么也做不了:

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

我猜它是由一个不了解null在sql中如何工作的人编写的,或者是一个习惯于oracle的人编写的,其中null和“”是等价的。
DisplayField和SecondaryField有不同的内容。displayField显示此人的公司和姓名,而secondaryField显示此人的地址、州和邮政编码。这些都不是多余的。
复杂性来自于试图处理空白或未指定的内容。

08-06 12:27