温馨提示:本文翻译自stackoverflow.com,查看原文请点击:php - How to sort data ASC by total count of word in MYSQL
mongodb mysql node.js php

php - 如何在MySQL中按单词总数对数据ASC排序

发布于 2020-03-27 15:39:58

我正在寻找一个查询,该查询首先返回所有完全匹配项,然后返回包含按单词数排序的搜索字符串中一个或多个单词的行。

如果用户搜索单词“ Banana”,则查询应返回仅包含“ Banana”的所有行,然后是“ Banana” +1个单词,然后是“ Banana” +2个单词,依此类推。

范例1

搜索“香蕉”:

  1. 香蕉

  2. 香蕉船

  3. 香蕉蛋糕

  4. 香蕉奶油饼干

  5. ...

范例2:

搜索“香蕉蛋糕”:

  1. 香蕉蛋糕
  2. 香蕉
  3. 蛋糕
  4. 香蕉船
  5. 巧克力蛋糕
  6. 香蕉奶油饼干
  7. ...

查看更多

查看更多

提问者
Vishal Pavasiya
被浏览
111
tcadidot0 2020-01-31 16:47

尝试这个:

#1st Query
SELECT *,LENGTH(fname)-LENGTH(replace(fname,' ','')) as word_count FROM mytable
ORDER BY word_count ASC;

#2nd Query
SELECT A.fname, LENGTH(A.fname)-LENGTH(replace(A.fname,' ','')) as word_count FROM mytable A LEFT JOIN
(SELECT *,LENGTH(fname)-LENGTH(replace(fname,' ','')) as w_count FROM mytable WHERE fname='Banana Cakes') B
ON A.fname=B.fname
ORDER BY CASE WHEN B.fname IS NOT NULL THEN B.w_count END DESC, 
         CASE WHEN B.fname IS NOT NULL THEN LENGTH(B.fname) END DESC, 
         word_count ASC;

在这里提琴:https : //www.db-fiddle.com/f/3gwZj9yMp43dhmzaETKghd/4

因此,第一个很简单,只需要按长度的升序和fname降序排序(因为您的示例显示Banana Split了返回的第一位,Banana Cakes尽管长度和字数都差不多。按字母顺序,“ C”排在最前面,所以Banana Cakes应该先返回)。

第二个查询我使“香蕉蛋糕”查询成为条件,然后LEFT JOIN成为主表的子查询ORDER BY我正在使用的CASE表达式上,如果LEFT JOIN(子查询的结果)的结果不为NULL,则ORDER首先使用该值,然后第二阶条件类似于第一查询中的第一阶条件。

编辑:为订单添加字数统计条件。请注意,此字数统计功能是在计算多少个空格而不是多少个字。示例:0仅表示一个没有空格的单词,1表示两个带有1个空格的单词。