如何解决MySQL匹配项目的部分或类似说明
嘿,我正在努力弄清楚如何才能将某些具有相似但名称却不相同或名称不同的产品进行匹配。
这是东西。
我选择了特定类别的产品,这是一些汽车零件不允许的:)。
因此购买的人有时会添加描述“ this and that L”或“ this and that R” 这意味着该零件是左还是右,它们单独出售,或者您可以成对购买,但要这样做,我需要将所有确切的左和右匹配。更复杂的是,每个从事采购工作的人都有自己独特的写作风格,有时L会出现在中间,有时在末尾,有时会出现斜杠/ L,而且product_id在大多数情况下也应如此接连的情况让我们说10001 L和10002,R,但一般来说不是,我的最终sintax也应满足以下条件:我想查看匹配L的库存是否不同于匹配R的库存,这样配对购买将一直可用。
这是表格的示例
所以我在考虑GROUP BY品牌,以某种方式进行匹配,并在匹配L的股票匹配R的股票的情况下显示结果。
欢迎欢迎任何有关如何攻击描述字符串的想法。我应该指出,从一个字符串中仅隔离L或R并不明智,因为一个品牌可以具有许多匹配对。另外,我应该为所有匹配组中的所有项目分配L或R,这样我就可以计算出它们的差异
解决方法
万岁!长期以来,最好的做法是在表中添加一个列,例如“ hand”,并让您的采购代理商正确填充该列。但是你知道的。
同时,我建议您向数据库中添加一个VIEW,以便您可以查看该表,就像它具有“ hand”列一样。在您看来,多余列的定义将包含一个笨拙的CASE WHEH THEN语句,用于计算“ hand”的值。
为什么要这样?从产品描述中提取惯用性的业务规则没有很好地定义,您将不得不弄混此VIEW,以使其针对您的各种情况做正确的事情。如果将其定义为VIEW,则可以轻松检查结果以确保结果正确。
您将想要执行以下操作:
CREATE OR REPLACE VIEW inventory_with_hand AS
SELECT *,CASE
WHEN description LIKE '%/LEFT%' THEN 'L' /* /LEFT */
WHEN description LIKE '%/RIGHT%' THEN 'R' /* /RIGHT */
WHEN description LIKE '%/L %' THEN 'L' /* /L space */
WHEN description LIKE '%/R %' THEN 'L' /* /R space */
WHEN RTRIM(description) LIKE '%L' THEN 'L' /* L at end of string */
WHEN RTRIM(description) LIKE '%R' THEN 'R' /* R at end of string */
WHEN description LIKE '% L %' THEN 'L' /* space L space */
WHEN description LIKE '% R %' THEN 'R' /* space R space */
ELSE '' END hand
FROM inventory;
一旦有了该视图,就可以使用它查看数据,以查看是否正确处理了L / R。使用这样的查询并滚动浏览结果。 (https://www.db-fiddle.com/f/haKdYj2G8eb9rdMZCPvQk2/1)
SELECT description,hand
FROM inventory_with_hand
ORDER BY hand<>'',description,hand;
希望您会看到很多正确处理的数据和一些错误处理的数据。您可以在视图中的WHEN THEN级联中添加新案例,直到正确处理数据为止。
WHEN THEN对这个应用程序有好处,因为它的结构与if / else if / else if / else相同。 SQL按照给它们的顺序处理WHEN THEN子句。当一个匹配时,匹配过程停止。
一旦您具有正确的L / R值,就可以继续进行查询以搜索匹配对。有很多方法可以处理脏数据对。一个可能对您有用的是:
寻找description
个彼此不同的字符串。字符串之间的Levenshtein distance对此很有用。有一个MySQL stored function可以在Github上由Kevin Woblick进行计算。
这是一个查询,用于按品牌,ID的相似性,L和R变体的存在以及Levenshtein距离搜索对。
SELECT l.description,LEAST(r.stock,l.stock) pairstock,l.stock lstock,r.stock rstock
FROM inventory_with_hand l
JOIN inventory_with_hand r
ON l.id <> r.id /* L and R must have different ids */
AND l.hand = 'L' /* left */
AND r.hand = 'R' /* right */
AND ABS (l.id - r.id) < 10 /* id values close enough */
AND l.brand = r.brand /* same brand */
AND LEVENSHTEIN(l.description,r.description) <= 5
不幸的是,这不能完美地工作。但这值得一试。
我使用5
作为Levenshtein距离限制来解决/LEFT
和/RIGHT
之间的差异。如果只有/L
和/R
,则可以改用1
,这样查询将变得更加可靠。
警告:LEVENSHTEIN存储功能非常慢。尝试通过先匹配其他事物来缩小其用途。我缩小了ID和品牌。
,再次感谢Jones的帮助,而您正忙于帮助我 我正在尝试一些匹配string_length的选项,条件是ID仅是两个数字上下两个,并且匹配对的L.stock和R.stock之间的差异不为零,并且库存必须大于零。
我必须说取得了一些不错的结果
SELECT id,LENGTH(description),brand,stock FROM data a
WHERE EXISTS (
SELECT 1 FROM data b
WHERE length(a.description) = length(b.description)
AND a.id <> b.id
AND b.id- a.id BETWEEN -2 AND 2
AND a.stock - b.stock <> 0
AND a.stock > 0
AND b.stock > 0)
按长度排序(描述)DESC
,LEVENSTHEIN函数看起来真的很有趣,我试图找出创建函数的所有变量,以便我可以对其进行优化,而不是复制粘贴...
乍一看,我所看到的是字符串的最大长度设置为255,这是应用时要选择的最大数字,然后他声明了一些字符串或子字符串及其长度,然后有一个整数一堆Js,是cs,不管是什么……似乎很重要:)任何方式...我将ABS设置为较低,因为其中大多数只是+ -1,有些时候是这样,但即使困难,将距离设置为1或5也似乎合乎逻辑。它绝对不会做的R或RIGHT。我必须将其设置为至少20个,才能获得满足必要条件的完整对对的列表。
我用它来试用生产能力及其20秒的时间,以导出带有项目完整列表的CSV并导入到ERP中作为补充对象。
后来,我开始对那些不符合所有条件的项目进行检查,然后再次出现异常值。
这里有4个ID; 2L和2R,但满足3对原因: L.id R.id,它们在同一品牌范围内...
我注意到的是,descrp字符串包含一个数字子字符串,该子字符串基本上类似于制造商代码,或者类似我创建了DIGITS FUNCTION函数,该函数从字符串中返回所有数字。
L的代码始终低于R的代码
在这种情况下,我们有 (ID越低,代码越高级,通常是按比例的)
我的数字功能将返回字符串中的所有数字
因此来自此“ KRAJNIK VW VO-ES-8215 L T-4 90->”
我将获得8215490,其匹配对应该为8217490
我当时想像是按那些子字符串中的位置来隔离唯一字符,这些字符分别是L的数字5和R的数字7,并将这种关系命名为条件,即L和R在同一位置的不同字符应小于R,但是在错误配对的示例中也是如此。
也许我应该只是嘿,如果一个L id与R.id相匹配,那就走近一点 但是33214与33213和33215相匹配,两者的距离相同,并且规则较低或较高并不适用于整个集合,有时L.id> R.id ...
在某些情况下,L.code 这是一件棘手的事情,
总共只有8个项目是离群值,在这一点上,我什至没有兴趣,我相信公司是明智的选择,但是当您想正确执行操作时,呵呵....
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。