MySQL:选择最接近的匹配?

时间:2009-10-29 14:18:46

标签: sql mysql

我想显示产品最接近的相关项目。所以说我正在展示产品,样式编号是SG-sfs35s。有没有办法选择哪个产品的样式编号最接近?

感谢。

编辑:回答你的问题。好吧,我绝对想保留前2个字母,因为这是制造商代码,但是对于第一个破折号之后的部分,只是最接近的匹配。所以例如SG-sfs35s将比SG-shs35s更匹配SG-shs35s。我希望每当我做 LIKE product_style_number 时它才有意义,它只会拉出完全匹配。

5 个答案:

答案 0 :(得分:5)

通常没有简单的方法来匹配大致相似的产品代码。

更友好的SQL解决方案是创建一个新表,将每个产品映射到与其相似的所有产品。

此表要么需要手动维护,要么可以定期执行更复杂的脚本来更新它。

如果您的产品代码遵循一致的模式(类似产品的所有字母都相同,只有数字更改),那么您应该能够使用正则表达式来匹配类似的项目。有here...

的文档

答案 1 :(得分:1)

您可能希望将其作为存储过程来执行,因为我预计该算法可能并不简单。

例如,您可以将该术语拆分为-,因此您有两部分。您对每个部分进行LIKE查询并使用它来做出决定。

你可以循环,用你的存储过程替换最后一个字符“%”,直到你得到至少一个结果。

答案 2 :(得分:1)

听起来你想要的是 levenshtein distance

不幸的是,mysql没有内置的levenshtein函数,但是有些人提出了user-defined function that does it

答案 3 :(得分:0)

听起来你需要像Lucene这样的东西,虽然我不确定这对你的情况是否有点过分。但它肯定能够进行文本搜索并首先返回最相似的文本。

如果您需要更简单的东西,我会尝试使用完整的产品代码进行搜索,然后如果不起作用,请尝试使用通配符/删除一些字符,直到返回结果。

答案 4 :(得分:0)

JD Isaacks。

你的这种情况很容易解决。 这不像你需要像谷歌那样使用人工智能。

http://www.w3schools.com/sql/sql_wildcards.asp

在w3schools查看本手册,了解与您的SELECT代码一起使用的通配符。

但您还需要创建一个包含3列的新表:LeftCodeRightCodeWildCard

示例:

表上的行:

  1. LeftCode = SG | RightCode = 35s | WildCard = SG-s_s35s
  2. LeftCode = SG | RightCode = 64s | WildCard = SG-s_t64s
  3. SQL代码

    如果用户键入了与表的row1匹配的代码:

    SELECT * FROM PRODUCTS WHERE CODE LIKE "$WildCard"; 
    

    其中$WildCard是包含新表的第3列的PHP变量。

    我希望我帮助,甚至晚了4年......