MySQL通过部分或类似描述匹配项

MySQL通过部分或类似描述匹配项,mysql,substring,matching,Mysql,Substring,Matching,嘿,伙计们,我想弄清楚我如何才能匹配某些产品,这些产品的名称相似但并不总是相同,或者名称上的关键差异 事情是这样的 我选择了一个特定类别的产品,它是一些汽车零件,我们不能进入:) 因此,采购人员有时会添加一个描述“这个和那个L”或“这个和那个R” 这意味着零件是左的或右的,它们可以单独出售,也可以成对购买,但为了做到这一点,我需要将所有精确的左与右匹配。为了使它变得更加复杂,每一个购买作品的人都有自己独特的写作风格,有时L会在中间,有时在结尾,有时有斜杠/ L很多,而且产品ID应该在大多数情况下

嘿,伙计们,我想弄清楚我如何才能匹配某些产品,这些产品的名称相似但并不总是相同,或者名称上的关键差异

事情是这样的

我选择了一个特定类别的产品,它是一些汽车零件,我们不能进入:)

因此,采购人员有时会添加一个描述“这个和那个L”或“这个和那个R” 这意味着零件是左的或右的,它们可以单独出售,也可以成对购买,但为了做到这一点,我需要将所有精确的左与右匹配。为了使它变得更加复杂,每一个购买作品的人都有自己独特的写作风格,有时L会在中间,有时在结尾,有时有斜杠/ L很多,而且产品ID应该在大多数情况下一个接一个让我们说10001 L和10002,R,但不是一般的,我的最终sintax也应该有一个条件,我想看看我的匹配L的股票是否与匹配R的股票不同,这样一来,成对购买的期权将始终可用

下面是该表的一个示例

所以我是按品牌分组,按描述进行匹配,并在匹配L的股票和匹配R的股票的情况下显示结果


欢迎任何关于如何攻击描述字符串的想法。我应该指出,仅仅从字符串中分离L或R是不明智的,因为一个品牌可以有许多匹配对。此外,我还应该为所有匹配组中的所有项目指定like L或R,这样我就可以计算它们的差异了,我想这是脏数据的万岁。从长远来看,您最好的做法是在表中添加一个名为“hand”的列,并让您的采购代理正确填充该列。但是你知道的

同时,我建议您向数据库中添加一个视图,以便您可以像查看“hand”列一样查看该表。在您看来,额外列的定义将包括一个大而丑的CASE,然后是计算“hand”值的语句

为什么要这样做?您从产品描述中提取利手的业务规则没有很好的定义,您将不得不在这个视图中胡思乱想,以便让它为您的各种情况做正确的事情。如果将其定义为视图,则可以轻松检查结果以确保其正确性

您将需要执行以下操作:

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;
一旦你有了这个视图,你就可以用它来查看你的数据,看看你是否正确地处理了信用证。使用类似这样的查询并滚动查看结果。()

不幸的是,这不会完全奏效。但是值得一试

我使用
5
作为Levenshtein距离限制,以解释
/LEFT
/RIGHT
之间的差异。如果您只有
/L
/R
,则可以使用
1
,这样您的查询将更加可靠


警告:LEVENSHTEIN存储函数非常慢。通过先匹配其他东西来缩小它的使用范围。我缩小了id和品牌的范围。

为肮脏的数据欢呼。从长远来看,您最好的做法是在表中添加一个名为“hand”的列,并让您的采购代理正确填充该列。但是你知道的

同时,我建议您向数据库中添加一个视图,以便您可以像查看“hand”列一样查看该表。在您看来,额外列的定义将包括一个大而丑的CASE,然后是计算“hand”值的语句

为什么要这样做?您从产品描述中提取利手的业务规则没有很好的定义,您将不得不在这个视图中胡思乱想,以便让它为您的各种情况做正确的事情。如果将其定义为视图,则可以轻松检查结果以确保其正确性

您将需要执行以下操作:

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;
一旦你有了这个视图,你就可以用它来查看你的数据,看看你是否正确地处理了信用证。使用类似这样的查询并滚动查看结果。()

不幸的是,这不会完全奏效。但是值得一试

我使用
5
作为Levenshtein距离限制,以解释
/LEFT
/RIGHT
之间的差异。如果您只有
/L
/R
,则可以使用
1
,这样您的查询将更加可靠


警告:LEVENSHTEIN存储函数非常慢。通过先匹配其他东西来缩小它的使用范围。我缩小了身份证和品牌的范围。

再次感谢琼斯在你忙着帮我的时候提供的意见 我尝试了一些匹配字符串_长度的选项,条件是ID只高或低两个数字,匹配对的L.stock和R.stock之间的差值不同于零,并且stock必须高于零

我得说我得到了一些不错的结果

SELECT id, description, 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)
从数据a中选择id、说明、长度(说明)、品牌、库存
哪里有(
从数据b中选择1
其中长度(a.说明)=长度(b.说明)
a.id和b.id
b.id-a.id介于-2和2之间
a股-b股0
a股>0
b.股票>0)
按长度订购(说明)说明


再次感谢琼斯在你忙着帮我的时候提供的意见 我尝试了一些匹配字符串_长度的选项,条件是ID只高或低两个数字,匹配对的L.stock和R.stock之间的差值不同于零,并且stock必须高于零

我得说我得到了一些不错的结果

SELECT id, description, 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)
从数据a中选择id、说明、长度(说明)、品牌、库存