【发布时间】:2010-06-30 21:57:43
【问题描述】:
我在 CMS 软件的范围内工作,该软件会自动生成一个查询,以便在 google 建议之类的输入字段中使用。
提供的字段工作正常,他们使用的查询使用两个表的内部连接。
我正在尝试进行查询,该查询将只从一个表中获取信息,并返回名字、姓氏或护照号码的结果。
目前,它在某些情况下有效,而在其他情况下无效,我不知道为什么。原因肯定和查询有关,因为包含的查询没有这个问题。
目前,如果我输入“r”,它会显示客人 robert wilson 和 ray barone 的结果,其中护照号码、名字和姓氏都与正确的字段匹配。
如果我输入 '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'的结果
【问题讨论】: