我正在针对特定关键字在名为Subject
和Text
的两个文本字段中进行搜索。为此,我使用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
我正在寻找的东西是返回每行的主题和文本列上的匹配数,然后在每行的关键字出现次数最多之后对结果进行排序。
答案 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
建议 @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
答案 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
项目(subject
和text
),并将其存储在另一个包含news_id
和发生次数的表格中然后与之匹敌。