一群人在一段时间内不一致地输入数据。 有些人会输入:
101mxeGte - TS 200-10
其他人会进入这个
101mxeGte-TS-200-10
可悲的是,那些应该是相同的记录。
他们也会不一致地搜索。如果以某种方式输入记录,则有些人会以相反的方式进行搜索。
现在,我知道如何修复未来的数据输入,但这不是我要问的问题。我想知道如何:
我在这里要求不可能吗?
到目前为止,我发现的最好的事情是使用mySQL中的REPLACE函数简单muck about with the existing data的建议。
我对这个选项感到不舒服,因为这意味着它肯定会积极地惹恼一半的用户。所有人的焦虑不安都低于一半的积极愤怒。
问题在于它必须双向: 在查询中输入空格必须同时找到空格和非空格条目, 并且不输入空格也必须找到空格和非空格条目。
感谢您提供的任何帮助!
答案 0 :(得分:3)
“理想”解决方案非常简单:
您还可以编写一个小程序将所有现有数据转换为规范形式(无论如何,您将拥有它的代码,因为步骤2和3中的“规范化”要求您编写执行此操作的代码)。
编辑:有关如何规范化的一些具体信息
使用您提供的样本数据,算法可能是:
这种方法有任何实际问题吗?
答案 1 :(得分:0)
如果它取决于我,我将使用REPLACE更新数据库中的数据,并且在处理给定行时将来的搜索将删除输入中的所有空格。
答案 2 :(得分:0)
从现有数据和搜索输入中修剪空格。这样,将始终返回预期的记录。但是,希望您的数据量很小,因为它的性能会很差。
编辑:通过“现有数据”我的意思是“查询现有数据”。我的回答是基于无法触及实际数据的假设(这可能不正确)。
答案 3 :(得分:0)
据推测,您的用户在HTML表单中输入搜索条件(或创建记录时记录详细信息),然后转到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)
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相同。