mysql 获取百分比结果,如何以百分比形式获取mysql匹配的结果?

I am using Match (Col1) Against (Val) in mysql.

select match(body) against(body_var) from articles;

now in case of completely match i am getting result as a number (for example 14.43).

what does this number mean? and the main question is can i get the result in percentage form (for example 0.94)

thanks for your help

解决方案

There is probably a MUCH easier way to do this.. Somehow i fell down the rabbit hole on this one.. But its tested and works (returns percentage of results)

SELECT (mthCount / ttlCount) AS mPercent

FROM (

SELECT COUNT( * ) AS mthCount

FROM articles WHERE (

MATCH(body) AGAINST(body_var)

)

) AS MCount JOIN (

SELECT COUNT( * ) AS ttlCount

FROM articles

) AS TCount;

it returns one record/result with the column mPercent

You could also have it round to two decimal places...

SELECT FORMAT((mthCount / ttlCount),2) AS mPercent

FROM (

SELECT COUNT( * ) AS mthCount

FROM articles WHERE (

MATCH(body) AGAINST(body_var)

)

) AS MCount JOIN (

SELECT COUNT( * ) AS ttlCount

FROM articles

) AS TCount;

As i said.. I tested it against 358 rows with 50 matches

50/350 = 0.1396648... (for first result)

0.14 for rounded result

If you are looking to convert the relevance value to a percent for a single result - it isnt really going to happen...

The relevance value from the MATCH/AGAINST is not a good indicator of percent match.. This is covered in depth throught the internet.. Search for "Convert Relevance value to percent" ...

If you wanted to order your results by relevence match percent, with the first result always having 100% relevence, you can do that...

As for trying to get a value like PHP's similar_text - you are better to offload that work to the client...

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MySQL 中,你可以通过使用 LIKE 操作符来执行基于模式的字符串匹配。LIKE 操作符支持使用 % 通配符来匹配任意数量的字符,以及使用 _ 通配符来匹配单个字符。 例如,如果你想匹配所有以 "abc" 开头的字符串,可以使用以下查询: ``` SELECT * FROM mytable WHERE mycolumn LIKE 'abc%'; ``` 如果你想匹配所有以 "abc" 结尾的字符串,可以使用以下查询: ``` SELECT * FROM mytable WHERE mycolumn LIKE '%abc'; ``` 如果你想匹配所有包含 "abc" 的字符串,可以使用以下查询: ``` SELECT * FROM mytable WHERE mycolumn LIKE '%abc%'; ``` 然而,在 MySQL 中并没有内置的百分比匹配功能。如果你想计算一个字符串与另一个字符串的匹配程度百分比,你需要使用一些外部库或自定义函数来实现。 一个常见的方法是使用 Levenshtein 距离算法来计算两个字符串之间的编辑距离,然后将其归一化为 0 到 1 的范围。你可以在 MySQL 中实现一个自定义函数来计算 Levenshtein 距离,然后在查询中使用它来计算匹配程度百分比。 以下是一个示例 Levenshtein 距离函数的实现: ``` DELIMITER // CREATE FUNCTION levenshtein(s1 VARCHAR(255), s2 VARCHAR(255)) RETURNS INT BEGIN DECLARE s1_len, s2_len, i, j, c, c_temp INT; DECLARE s1_char CHAR; DECLARE cv0, cv1 VARCHAR(255); SET s1_len = CHAR_LENGTH(s1); SET s2_len = CHAR_LENGTH(s2); SET cv1 = REPEAT(CHAR(0), s2_len+1); SET i = 1; WHILE i <= s1_len DO SET s1_char = SUBSTRING(s1, i, 1); SET cv0 = CONCAT(CHAR(i), REPEAT(CHAR(0), s2_len)); SET j = 1; WHILE j <= s2_len DO SET c = IF(s1_char = SUBSTRING(s2, j, 1), 0, 1); SET c_temp = ASCII(SUBSTRING(cv1, j, 1)) + 1; IF c_temp > ASCII(SUBSTRING(cv0, j+1, 1)) THEN SET c_temp = ASCII(SUBSTRING(cv0, j+1, 1)); END IF; IF c_temp > ASCII(SUBSTRING(cv1, j+1, 1)) + 1 THEN SET c_temp = ASCII(SUBSTRING(cv1, j+1, 1)) + 1; END IF; SET cv0 = CONCAT(cv0, CHAR(c_temp)); SET j = j + 1; END WHILE; SET cv1 = cv0; SET i = i + 1; END WHILE; RETURN ASCII(SUBSTRING(cv1, s2_len+1, 1)) / LEAST(s1_len, s2_len); END // DELIMITER ; ``` 该函数使用了动态
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值