如何在数据输入不一致时查找记录?

时间:2011-04-17 22:51:09

标签: php mysql string whitespace

一群人在一段时间内不一致地输入数据。 有些人会输入:

101mxeGte - TS 200-10

其他人会进入这个

101mxeGte-TS-200-10
可悲的是,那些应该是相同的记录。

他们也会不一致地搜索。如果以某种方式输入记录,则有些人会以相反的方式进行搜索。

现在,我知道如何修复未来的数据输入,但这不是我要问的问题。我想知道如何:

  1. 保留数据,但......
  2. 寻找合适的人选。
  3. 我在这里要求不可能吗?

    到目前为止,我发现的最好的事情是使用mySQL中的REPLACE函数简单muck about with the existing data的建议。

    我对这个选项感到不舒服,因为这意味着它肯定会积极地惹恼一半的用户。所有人的焦虑不安都低于一半的积极愤怒。

    问题在于它必须双向: 在查询中输入空格必须同时找到空格和非空格条目, 并且不输入空格也必须找到空格和非空格条目。

    感谢您提供的任何帮助!

6 个答案:

答案 0 :(得分:3)

“理想”解决方案非常简单:

  1. 决定表示记录的规范方式
  2. 当有人保存记录时,请在保存之前将其标准化
  3. 当有人搜索记录时,在搜索之前规范化输入
  4. 您还可以编写一个小程序将所有现有数据转换为规范形式(无论如何,您将拥有它的代码,因为步骤2和3中的“规范化”要求您编写执行此操作的代码)。

    编辑:有关如何规范化的一些具体信息

    使用您提供的样本数据,算法可能是:

    1. 用连字符替换所有空格
    2. 用一个连字符替换一个或多个连字符的所有运行(正则表达式对此最简单 - 实际上,正则表达式可以一次完成两个步骤)
    3. 这种方法有任何实际问题吗?

答案 1 :(得分:0)

如果它取决于我,我将使用REPLACE更新数据库中的数据,并且在处理给定行时将来的搜索将删除输入中的所有空格。

答案 2 :(得分:0)

从现有数据和搜索输入中修剪空格。这样,将始终返回预期的记录。但是,希望您的数据量很小,因为它的性能会很差。

编辑:通过“现有数据”我的意思是“查询现有数据”。我的回答是基于无法触及实际数据的假设(这可能不正确)。

答案 3 :(得分:0)

据推测,您的用户在HTML表单中输入搜索条件(或创建记录时记录详细信息),然后转到PHP脚本。看起来您的数据总是以不包含空格的方式编写,所以为什么不这样做:

  • 运行从现有数据中删除空格的查询
  • 在接收表单的PHP脚本中添加代码,以便从提交的数据中删除空格 - 无论该数据是用于搜索还是用于编写新数据。

编辑:我猜你还需要将一些空格更改为连字符。写逻辑不应该太难以实现这一点。

答案 4 :(得分:0)

像这样。

伪代码:

$myinput = mysql_real_escape_string('101mxeGte-TS-200-10')
$query = " SELECT * FROM table1 
           WHERE REPLACE(REPLACE(f1, ' ', ''),'-','') 
                 = REPLACE(REPLACE($myinput, ' ', ''),'-','') "

或者,您可以编写自己的函数来修剪数据,以便进行比较。

DELIMITER $$

CREATE FUNCTION myTrim(AStr varchar) RETURNS varchar
BEGIN
  declare Result varchar;
  SET Result = REPLACE(AStr, ' ','');
  SET Result = ......
  .....
  RETURN Result;
END$$

DELIMITER ;

然后在您的选择

中使用此功能
$query = " SELECT * FROM table1 
           WHERE MyTrim(f1) = MyTrim($myinput) "

答案 5 :(得分:-1)

你听说过SQL的喜欢吗? http://dev.mysql.com/doc/refman/4.1/en/string-comparison-functions.html 还有正则表达式 http://dev.mysql.com/doc/refman/4.1/en/regexp.html#operator_regexp

101mxeGte - TS 200-10
101mxeGte-TS-200-10
how about this?
SELECT 'justalnums' REGEXP '101mxeGte[[:blank:]]*(\-[[:blank:]]*)?TS[[:blank:]-]*200[[:blank:]-]*10'

数字可以用[0-9]表示,alphas用[a-z]或[A-Z]或[a-zA-Z]表示 附加一个+然后再做多个。 perens允许你分组甚至捕获perens中的内容,然后在替换或其他内容中重复使用。

RLIKE与REGEXP相同。