MySQL按出现次数排序

Mak*_*a95 6 php mysql database web

我做两个名为文本字段搜索SubjectText特定关键字.为此,我使用该LIKE语句.尝试按出现次数对结果进行排序时遇到问题.

我的搜索查询如下所示:

SELECT * FROM Table WHERE (Text LIKE '%Keyword%' OR Subject LIKE '%Keyword%')
Run Code Online (Sandbox Code Playgroud)

我尝试添加一个count()语句并按出现次数对其进行排序,但count()语句只是继续返回表中的行数.

这是带有count语句的查询:

SELECT *, COUNT(Text LIKE '%Keyword%') AS cnt FROM News WHERE (Text LIKE '%Keyword%' OR Subject LIKE '%Keyword%') ORDER BY cnt
Run Code Online (Sandbox Code Playgroud)

我正在寻找的东西是返回每行的主题和文本列上的匹配数,然后在每行上出现最多关键字后排序结果.

M K*_*aid 4

下面的查询可以为您提供字符串在两列(即文本和主题)中出现的次数,并将按条件对结果进行排序,但这不是一个好的解决方案,性能方面最好在应用程序代码级别对结果进行排序

SELECT *,
(LENGTH(`Text`) - LENGTH(REPLACE(`Text`, 'Keyword', ''))) / LENGTH('Keyword')
+
(LENGTH(`Subject`) - LENGTH(REPLACE(`Subject`, 'Keyword', ''))) / LENGTH('Keyword') `occurences`
 FROM 
`Table`
 WHERE (Text LIKE '%Keyword%' OR Subject LIKE '%Keyword%')
ORDER BY `occurences`  DESC
Run Code Online (Sandbox Code Playgroud)

小提琴演示

@lserni建议一种更简洁的计算出现次数的方法

SELECT *,
(LENGTH(`Text`) - LENGTH(REPLACE(`Text`, 'test', ''))) / LENGTH('test') `appears_in_text`,

(LENGTH(`Subject`) - LENGTH(REPLACE(`Subject`, 'test', ''))) / LENGTH('test') `appears_in_subject`,

(LENGTH(CONCAT(`Text`,' ',`Subject`)) - LENGTH(REPLACE(CONCAT(`Text`,' ',`Subject`), 'test', ''))) / LENGTH('test') `occurences`
 FROM 
`Table1`
 WHERE (TEXT LIKE '%test%' OR SUBJECT LIKE '%test%')
ORDER BY `occurences`  DESC
Run Code Online (Sandbox Code Playgroud)

小提琴演示 2