Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Mysql count instances of substring, then order by

I have a problem in mySQL that goes as follows:

  • Count the instances of a substring in a string field in a mySQL database
  • Order the results by the number of occurrences of that substring (DESC)

I have never done anything other than rudimentary queries.. I can't find a solution elsewhere.

like image 734
Alan Avatar asked Mar 25 '11 01:03

Alan


People also ask

How do I count the number of repeated characters in a string in MySQL?

mysql> SELECT Cases,StringValue, -> ROUND ( -> ( -> LENGTH(StringValue)- LENGTH( REPLACE (StringValue, "MySQL", "") ) -> ) / LENGTH("MySQL") -> ) AS NumberOfOccurrenceOfMySQL -> from StringOccurrenceDemo; Here is the output. The above output shows that we have found the count for occurrences of string 'MySQL'.

How do I count how many times a word appears in SQL?

T-SQL doesn't provide a built-in function to count the number of times a particular string appears within another string, so to find out how many times a word appears in a row, you have to build your own count function. SQL Server 2000 lets you create this kind of user-defined function (UDF).


1 Answers

SELECT (CHAR_LENGTH(str) - CHAR_LENGTH(REPLACE(str, substr, ''))) / CHAR_LENGTH(substr) AS cnt ... ORDER BY cnt DESC 

Yep, looks bloated but afaik there is no any other possible solution.

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) 
like image 139
zerkms Avatar answered Sep 30 '22 21:09

zerkms