php - 用于智能搜索的 Tricky SQL

标签 php sql mysql database

我正在通过 PHP CMS 系统使用表单,该表单定义了自定义字段等。

其中一个自定义字段允许输入字段进行智能搜索。这意味着当您开始输入时,它会显示匹配的记录,与 google suggest 非常相似。

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 看起来非常多余。

我不认为我的需求与当前示例智能搜索字段的工作方式有太大不同...只是我想要客人而不是客户,而不是地址,我只希望它匹配名字、姓氏或护照号码。

我想知道在那种情况下我是否还需要 secondaryfield?

特别是,from 子句中的内部连接让我感到困惑,因为我认为我不需要这样做,因为所有客人信息都在一张表中......

非常感谢这里的任何帮助,谢谢。

最佳答案

我用一些缩进重新格式化了您的代码示例,以便更容易阅读。它们很长并且水平滚动很难说出发生了什么。

这样的事情似乎什么都不做:

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

我猜它是由不了解 NULL 在 SQL 中如何工作的人或习惯于 Oracle 的人编写的,其中 NULL 和 '' 是等价的。

Displayfield 和secondaryfield 内容不同。 Displayfield 显示此人的公司和姓名,而 secondaryfield 显示此人的地址、州和邮政编码。这些都不是多余的。

复杂性来自于尝试处理空白或未指定的内容。

关于php - 用于智能搜索的 Tricky SQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3151941/

相关文章:

php - 获取后缀表中排名前十的装备

php - Imagick 知道图像尺寸吗? (文件大小)

php - 检查前一个 MySQL 查询的状态并执行下一个查询

mysql - 选择组,计算零

php - 删除单条记录 Laravel

php - setlocale 和 strftime 不翻译月份

php - 在 PHP 中获取上一个页面名称(不是整个 URL)

MySQL 加入语法错误

多个 FULLTEXT 索引上的 MySQL SELECT。结果极其缓慢

php - 在 CodeIgniter 中查询两个表