Mysql计算子串的实例,然后按顺序排序

Ala*_*lan 29 mysql substring count

我在mySQL中遇到的问题如下:

  • 计算mySQL数据库中字符串字段中子字符串的实例
  • 按该子字符串(DESC)的出现次数排序结果

除了基本的问题,我从未做过任何其他事情.我在其他地方找不到解决办法.

zer*_*kms 77

SELECT (CHAR_LENGTH(str) - CHAR_LENGTH(REPLACE(str, substr, ''))) / CHAR_LENGTH(substr) AS cnt
...
ORDER BY cnt DESC
Run Code Online (Sandbox Code Playgroud)

是的,看起来臃肿但是afaik没有任何其他可能的解决方案.

mysql> select (CHAR_LENGTH('asd') - CHAR_LENGTH(REPLACE('asd', 's', ''))) / CHAR_LENGTH('s');
+-----------------------------------------------------------------+
| (CHAR_LENGTH('asd') - CHAR_LENGTH(REPLACE('asd', 's', ''))) / CHAR_LENGTH('s') |
+-----------------------------------------------------------------+
|                                                          1.0000 |
+-----------------------------------------------------------------+
1 row in set (0.00 sec)



mysql> select host, (CHAR_LENGTH(host) - CHAR_LENGTH(REPLACE(host, 'l', ''))) / CHAR_LENGTH('l') AS cnt from user;
+-----------+--------+
| host      | cnt    |
+-----------+--------+
| 127.0.0.1 | 0.0000 |
| honeypot  | 0.0000 |
| honeypot  | 0.0000 |
| localhost | 2.0000 |
| localhost | 2.0000 |
+-----------+--------+
5 rows in set (0.00 sec)
Run Code Online (Sandbox Code Playgroud)

  • 作为东亚用户,我想提一下,如果**字段**(服务器端)和**substr**(客户端/应用程序端)都包含**多字节字符**并且它们使用**不同的编码**,LENGTH将获得*相同*字符串的**不同长度**,因此导致结果值为十进制而不是整数,并且您不能简单地将十进制值置于或者将十进制值置为整数,因为您没有知道服务器端字段的编码.例如:GBK编码中的`LENGTH('中文')`是4,UTF-8编码的`LENGTH('中文')`是6.因此,我将使用`CHAR_LENGTH`而不是LENGTH来计算字符串的长度. (8认同)