我正在两个名为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 cntim需要的是返回每一行的主题和文本列上的匹配数,然后在每一行中关键字出现次数最多之后对结果进行排序。
发布于 2014-03-02 20:24:14
下面的查询可以为您提供出现在两个列(即文本和主题)中的no.of字符串,并按条件对结果进行排序,但这并不是一个好的解决方案,从性能上讲,在应用程序代码级别对结果进行排序会更好。
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小提琴演示2
发布于 2014-03-02 20:18:06
你想要的是SUM。Count将计算有多少记录具有非空值,这意味着所有匹配和非匹配都将被计数。
SELECT *, SUM(Text LIKE '%Keyword') AS total_matches
...
ORDER BY total_matchesSUM()将计算出类似的结果所产生的布尔值,这些结果将被输入到整数中,因此您将得到一个类似于1+1+1+0+1 = 4的结果,而不是5个非空计数。
https://stackoverflow.com/questions/22132807
复制相似问题