【问题标题】:Tracing an ajax error to a sql query跟踪 ajax 错误到 sql 查询
【发布时间】: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'的结果

【问题讨论】:

    标签: sql mysql database ajax


    【解决方案1】:

    我在我的网站上做了类似的事情,我发现使用 REGEXP 而不是 LIKE 更可取,因为您不必担心开头和结尾的 % 符号等。

    一个简单的方法:

    SELECT * FROM table WHERE value REGEXP 'searchval'
    

    关于姓名的最后一个问题 - 确保搜索名字、姓氏和名字/姓氏连接。我只独立搜索了第一个和最后一个,无法弄清楚为什么全名会导致找到 0 条记录。

    【讨论】:

    • 不幸的是我没有那么奢侈,因为查询是由 CMS 软件生成的
    • 嗯...如果您无法更改 SQL,将很难为您提供帮助。你有纬度吗?这是一些棘手的查询!
    猜你喜欢
    • 1970-01-01
    • 2015-11-19
    • 1970-01-01
    • 2019-09-26
    • 2021-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多