首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >MySQL按次数排序

MySQL按次数排序
EN

Stack Overflow用户
提问于 2014-03-02 20:13:56
回答 2查看 2.2K关注 0票数 6

我正在两个名为SubjectText的文本字段中搜索特定的关键字。为此,我使用LIKE语句。我遇到了一个问题,当我试图排序的结果发生的次数。

我的搜索查询如下:

代码语言:javascript
运行
复制
SELECT * FROM Table WHERE (Text LIKE '%Keyword%' OR Subject LIKE '%Keyword%')

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

下面是有count语句的查询:

代码语言:javascript
运行
复制
SELECT *, COUNT(Text LIKE '%Keyword%') AS cnt FROM News WHERE (Text LIKE '%Keyword%' OR Subject LIKE '%Keyword%') ORDER BY cnt

im需要的是返回每一行的主题和文本列上的匹配数,然后在每一行中关键字出现次数最多之后对结果进行排序。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-03-02 20:24:14

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

代码语言:javascript
运行
复制
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提出的一种更简洁的计算事件的方法

代码语言:javascript
运行
复制
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

票数 4
EN

Stack Overflow用户

发布于 2014-03-02 20:18:06

你想要的是SUM。Count将计算有多少记录具有非空值,这意味着所有匹配和非匹配都将被计数。

代码语言:javascript
运行
复制
SELECT *, SUM(Text LIKE '%Keyword') AS total_matches
...
ORDER BY total_matches

SUM()将计算出类似的结果所产生的布尔值,这些结果将被输入到整数中,因此您将得到一个类似于1+1+1+0+1 = 4的结果,而不是5个非空计数。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22132807

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档