我正在CMS软件的范围内工作,它会自动生成一个查询,以便在谷歌建议中使用输入字段。
提供的字段工作正常,他们使用的查询使用两个表的内连接。
我正在尝试进行一个只从一个表中获取信息的查询,并将返回firstname,lastname或者护照号码的结果。
目前,它在某些情况下有效,而在其他情况下无效,我无法找到原因。原因肯定与查询有关,因为包含的查询没有这个问题。
目前,如果我输入'r',它会显示罗伯特威尔逊和雷巴罗的客人的结果,护照号码,名字和姓氏都与正确的字段匹配。
如果我输入'wi',它会返回robert wilson的结果,但如果我输入'wil'则不返回任何内容。
此外,仅输入'wi'会导致显示护照号码而不是姓氏。
除了查询不能正常工作外,还有一些奇怪的错误。如果我输入'%'或'b',那么我会收到有关语法错误的javascript警报。
在包含的查询中使用'%'或'b'工作正常,错误肯定与我的查询有关,我只是在弄清楚导致它的原因时遇到了麻烦。
查询是从存储在表中的一组较小查询中自动生成的,我之前在SO上发布过这些查询。如果有人能指出我为什么生成的查询有这种零星结果的方向,我将非常感激。
SELECT COUNT(IF(guests.passport != '', CONCAT(guests.passport , IF
(guests.lastname != ''
OR guests.lastname != '', CONCAT(' (',IF(guests.lastname != '',
guests.lastname, '{blank}'),', ',IF(guests.firstname != '',
guests.firstname, '{blank}'),')'), '')), IF(guests.lastname != ''
OR guests.lastname != '',
CONCAT(IF(guests.lastname != '',
guests.lastname, '{blank}'),', ',IF(guests.passport != '',
guests.passport, '{blank}')), ''))) AS thecount
FROM guests
WHERE (
guests.id!=0
)
AND
(
(
guests.firstname LIKE 's%'
OR guests.lastname LIKE 's%'
OR guests.passport LIKE 's%'
)
OR
(
(
guests.firstname LIKE 's%'
OR guests.firstname LIKE '% s%'
OR guests.lastname LIKE 's%'
OR guests.lastname LIKE '% s%'
OR guests.passport LIKE 's%'
OR guests.passport LIKE '% s%'
)
)
)
SELECT DISTINCT IF(guests.passport != '', CONCAT(guests.passport ,IF
(guests.lastname != ''
OR guests.lastname != '', CONCAT(' (',IF(guests.lastname != '',
guests.lastname, '{blank}'),', ',IF(guests.firstname != '',
guests.firstname, '{blank}'),')'), '')), IF(guests.lastname !=
''
OR guests.lastname != '', CONCAT(IF(guests.lastname != '',
guests.lastname, '{blank}'),', ',IF(guests.passport!= '',
guests.passport, '{blank}')), '')) AS display ,
`guests`.`uuid` AS value ,
1 AS secondary,
guests.id AS classname
FROM guests
WHERE (
guests.id!=0
)
AND
(
(
guests.firstname LIKE 's%'
OR guests.lastname LIKE 's%'
OR guests.passport LIKE 's%'
)
OR
(
(
guests.firstname
LIKE 's%'
OR
guests.firstname
LIKE '% s%'
OR guests.lastname
LIKE 's%'
OR guests.lastname
LIKE '% s%'
OR guests.passport
LIKE 's%'
OR guests.passport
LIKE '% s%'
)
)
)
ORDER BY IF(guests.passport != '', CONCAT(guests.passport ,IF
(guests.lastname != ''
OR guests.lastname != '', CONCAT(' (',IF(guests.lastname != '',
guests.lastname, '{blank}'),', ',IF(guests.firstname != '',
guests.firstname, '{blank}'),')'), '')), IF(guests.lastname !=
''
OR guests.lastname != '', CONCAT(IF(guests.lastname != '',
guests.lastname, '{blank}'),', ',IF(guests.passport!= '',
guests.passport, '{blank}')), ''))
LIMIT 0, 8
我希望格式化正常......我使用了格式化工具,但我并不确定格式化SQL的标准方法....
如果有任何帮助,所有这些都与phpBMS模块有关。
以上查询是输入's'的结果
答案 0 :(得分:0)
我在我的网站上做了类似的事情,我发现使用REGEXP而不是LIKE更可取,因为你不必担心开头和结尾的%符号等。
一个简单的方法:
SELECT * FROM table WHERE value REGEXP 'searchval'
最后一个关于名字的问题 - 确保搜索名字,姓氏和第一个/最后一个连接。我在第一次和最后一次独立搜索,无法弄清楚为什么全名会导致找到0条记录。