2015-08-18 42 views
1

我需要根据使用mysql的单词的重复性来排序结果。在mysql中按特定字数排序

这里是我的样品台

id Name keywords  Description 
1 John John, USA  John is good boy. John, John  
2 Alex Alex, John Alex is a friend of john. 
3 Rocky John   Rocky 
4 John John,John  John, John, John, John, John 

将采取 “约翰” 为例。在第一行中,“约翰”重复5次,第二行重复2次,第三行重复1次,第四行重复8次。我需要根据计数递减来显示结果。

Select * From table Where name like '%John%' OR keywords like '%John%' OR Description like '%John%' 

所以会显示下订单

id Name keywords  Description 
4 John John,John  John, John, John, John, John 
1 John John, USA John is good boy. John, John 
2 Alex Alex, John Alex is a friend of john. 
3 Rocky John   Rocky 
+0

https://dev.mysql.com/doc/refman/5.5/en/fulltext-search.html#f unction_match – M0rtiis

+2

这里有一个类似的问题:[count-the-number-of-a-string-in-a-varchar-field](http://stackoverflow.com/questions/12344795/count-the -n-varchar-field) – cars10m

回答

3

这将这样的伎俩:

SELECT id,Name,keywords,Description,  
ROUND ( 
    (
     LENGTH(CONCAT(Name,keywords,Description)) 
     -LENGTH(REPLACE(CONCAT(Name,keywords,Description), "John", "")) 
    )/LENGTH("John")   
) AS count  
FROM tbl ORDER BY `count` desc 

在这里看到:Demo

更新

如果您想寻找多个每条记录(不同的)的话,你 你应该使用一个用户自定义函数(UDF),如

CREATE function wcnt(wrd varchar(32), str varchar(1000)) returns int 
RETURN ROUND ((LENGTH(CONCAT(str))-LENGTH(REPLACE(CONCAT(str),wrd,"")))/LENGTH(wrd)); 

在这里看到:function-demo

或这里的一个combination of the first query with the UDF

+0

谢谢@ cars10它正在工作。我的表中有100万条记录,是否会影响性能? – satheesh

+0

对不起,没有这么多的经验。试试看;-) ... – cars10m

+0

好吧。对于像“'John,Good”这样的多个单词来说,它是相同的。因此,计数将成为连续任何一列中可用的关键字。 – satheesh

0
SELECT * FROM T 
ORDER BY FIND_IN_SET('John',Description) DESC 

FIDDLE

+0

不幸的是,它不*真*工作,请看这里:http://sqlfiddle.com/#!9/e07e2/1 – cars10m

+0

@ cars10如果你打破约翰不再是一个字是的,但他正在寻找单词 – Mihai

+0

谨慎回应? – Mihai