2010-06-30 60 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