Mysql 计算每个条目的相似匹配数

Mysql 计算每个条目的相似匹配数,mysql,string,match,Mysql,String,Match,我试着用一个简单的例子来解释我所说的匹配是什么意思: 我有一个表myprods,如下所示: id | name 1 galaxy s4 mini 2 samsung galaxy s4 3 galaxy galaxy s3 4 iphone 4s 5 apple iphone 4s 到目前为止,我有这个问题: SELECT * FROM myprods WHERE name LIKE "%samsung%" OR name LIKE "%galaxy%" O

我试着用一个简单的例子来解释我所说的匹配是什么意思:

我有一个表
myprods
,如下所示:

id | name
1    galaxy s4 mini
2    samsung galaxy s4
3    galaxy galaxy s3
4    iphone 4s
5    apple iphone 4s
到目前为止,我有这个问题:

SELECT *
FROM   myprods
WHERE  name LIKE "%samsung%" OR name LIKE "%galaxy%" OR name LIKE "%s4%"
我的查询结果是:

id | name
1    galaxy s4 mini
2    galaxy s4
3    galaxy galaxy s3
现在我不仅要返回匹配的行,还要返回命中数。如果有一个类似的短语应用于该行,则将是一次成功。所以在这种情况下,我希望命中率是0,1,2或3。这意味着:对于id=3,类似短语
“%galaxy%”
不应算作两次命中,它只算作“命中”或“未命中”

现在的预期结果是:

id | name               | hits
1    galaxy s4 mini       2
2    samsung galaxy s4    3
3    galaxy galaxy s3     1
用一个性能良好的mysql短语来说可能吗?
或者我应该只选择上面查询的行,然后在PHP中通过
strpos
将单个子字符串与返回的名称匹配?

在MySQL中,布尔表达式可以用作整数——0表示false,1表示true。因此,以下工作:

SELECT p.*,
       ((name LIKE '%samsung%') + (name LIKE '%galaxy%') + (name LIKE '%s4%')) as hits
FROM   myprods p
WHERE  name LIKE '%samsung%' OR name LIKE '%galaxy%' OR name LIKE '%s4%';
编辑:

如果是MySQL,也可以将此查询表示为:

SELECT p.*,
       ((name LIKE '%samsung%') + (name LIKE '%galaxy%') + (name LIKE '%s4%')) as hits
FROM   myprods p
HAVING hits > 0;

在此上下文中使用
having
是一个SQL扩展,在其他数据库中不起作用。但是,它确实允许查询引用列别名进行筛选,而无需使用子查询。

哦,这看起来不错。与Where子句中只有相同短语的SQL语句相比,将其作为整数返回不会影响性能,是吗?@tim。像这样做6次而不是3次应该不会对性能产生任何影响。然而,编辑后的答案提供了另一种选择。我认为mysql可能会对其进行内部组织,这样它就不会因为重复的类似短语而变成6倍;-)但是,是的,你的编辑非常好,谢谢:-)还有一件事我想到了:有可能把匹配的字符数算作一个和吗?这就是说,三星和galaxy的点击率为7+6=13(仍然是2次点击),而三星和s4的点击率为7+2=9,所以较长的点击率会更高。我刚刚想出了这样的想法:
((名字像三星%)*7+(名字像银河%)*6+(名字像“%s4%))*2作为命中长度
添加到查询中。有用吗?:-)