MySQL按出现次数排序

时间:2014-03-02 20:13:57

标签: php mysql database web

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

我的搜索查询如下所示:

SELECT * FROM Table WHERE (Text LIKE '%Keyword%' OR Subject LIKE '%Keyword%')

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

这是带有count语句的查询:

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

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

3 个答案:

答案 0 :(得分: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

Fiddle Demo

建议 @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

Fiddle Demo 2

答案 1 :(得分:2)

您想要SUM。 Count将计算有多少记录具有非空值,这意味着将计算所有匹配和非匹配。

SELECT *, SUM(Text LIKE '%Keyword') AS total_matches
...
ORDER BY total_matches

SUM()将计算LIKE生成的布尔值真实结果的数量,这将是整数的类型转换,因此您得到的结果如1 + 1 + 1 + 0 + 1 = 4,而不是5个非空值计数。

答案 2 :(得分:0)

// escape $keyword for mysql
$keyword = strtolower('Keyword');
// now build the query
$query = <<<SQL
    SELECT *,
    ((LENGTH(`Subject`) - LENGTH(REPLACE(LOWER(`Subject`), '{$keyword}', ''))) / LENGTH('{$keyword}')) AS `CountInSubject`,
    ((LENGTH(`Text`) - LENGTH(REPLACE(LOWER(`Text`), '{$keyword}', ''))) / LENGTH('{$keyword}')) AS `CountInText`
    FROM `News`
    WHERE (`Text` LIKE '%{$keyword}%' OR `Subject` LIKE '%{$keyword}%')
    ORDER BY (`CountInSubject` + `CountInText`) DESC;
SQL;

返回每个字段中出现次数并按其排序。

'keyword'需要更低才能实现此目的。我不认为它真的很快,性能明智,因为它需要小写字段,并且在MySQL中没有不区分大小写的搜索。

您可以按字词索引每个news项目subjecttext,并将其存储在另一个包含news_id和发生次数的表格中然后与之匹敌。