我的系统存储来自许多不同电子商店的产品,我需要根据产品名称配对产品。例如:
INPUT: MySQL表格产品
id | name | id_seller
1 porsche 911 red edition 1
2 red porsche 911 gt 2
3 icecream 1
期望的输出:建议产品1与产品2类似。
在第一步中,仅就常用词的数量提出建议就足够了 - 保时捷示例中的4个中有3个。
更复杂的解决方案将涉及比较单词的顺序而不仅仅是它们的出现次数,但我想这不会是微不足道的。
是否可以仅使用MySQL查询来完成,并且必须使用其内置函数或任何复杂的库/附加组件?
答案 0 :(得分:2)
以下SQLFiddle example Here is an example and stored procedure to do it用于查找name
列中至少有一个常用词的产品对:
select t.id id1, t.name name1, t1.id id2, t1.name name2 from t
join t t1
where t.id<t1.id
AND
t.name regexp
CONCAT('([[:<:]]',
REPLACE(
TRIM(t1.name),
' ',
'[[:>:]]|[[:<:]]'
),
'[[:>:]])');
如果你需要找到至少有N个常用词的行,你应该创建tmp表,将每行分成单词。 {{3}}。对于您的示例,此表格如下所示:
id | name
1 porsche
1 911
1 red
1 edition
2 red
2 porsche
2 911
2 gt
3 icecream
在这种情况下,您可以使用以下查询来查找至少包含N个常用字的ID(在这种情况下N = 3):
select t1.id,t2.id,count(*)
from tmp t1,tmp t2
where t1.id<t2.id and t1.name=t2.name
group by t1.id,t2.id having count(*)>=3