Mysql计算子串的实例,然后按顺序排列
我在MySQL中有一个问题,如下所示:
- 计算mySQL数据库中string字段的子string的实例
- 通过该子string的出现次数(DESC)
除了基本的查询,我从来没有做过任何其他的事情..我在其他地方找不到解决scheme。
SELECT (CHAR_LENGTH(str) - CHAR_LENGTH(REPLACE(str, substr, ''))) / CHAR_LENGTH(substr) AS cnt ... ORDER BY cnt DESC
是的,看起来臃肿,但afaik没有任何其他可能的解决scheme。
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)
DELIMITER // DROP FUNCTION IF EXISTS `subStringCount`// CREATE FUNCTION `subStringCount` (sequence VARCHAR(1000), word VARCHAR(100)) RETURNS INT(4) DETERMINISTIC CONTAINS SQL BEGIN DECLARE counter SMALLINT UNSIGNED DEFAULT 0; DECLARE word_length SMALLINT UNSIGNED; SET word_length = CHAR_LENGTH(word); WHILE (INSTR(sequence,word) != 0) DO SET counter = counter+1; SET sequence = SUBSTR(sequence, INSTR(sequence,word)+word_length); END WHILE; RETURN counter; END // DELIMITER ;
哪些可以通过调用执行:
SELECT sum(subStringCount(fieldName,'subString')) FROM `table` WHERE 1
存储上面的程序后,这工作得到了表中的string频率计数…
SELECT sum(subStringCount(fieldName,'subString')) FROM `table` WHERE 1