Funkce substr_count pro MySQL

Nedávno jsem narazil na zajímavý problém – potřeboval jsem v MySQL zjistit, kolikrát se v daném sloupci nachází daný řetězec a seřadit řádky podle počtu výskytů. Jinými slovy, potřeboval jsem obdobu funkce substr_count.

Kupodivu žádná taková funkce v MySQL neexistuje. I tak má ale problém řešení. Fíglem je využití kombinace funkcí LENGTH a REPLACE:

SELECT ( LENGTH( `column` ) – LENGTH( REPLACE( `column`, ‚výraz‘, “ ))) / LENGTH (‚výraz‘) …

Ač to vypadá děsivě (mohl bych říci prasárna, oblíbené to slovo programátorů jistého druhu), příkaz je kupodivu rychlý (alespoň na datech běžné velikosti).

V případě zájmu můžete použít i tuto funkci:

function mysql_substr_count( $haystack, $needle ) {
return "(" .
       "LENGTH(`{$haystack}`)" .
       " - LENGTH(" .
             "REPLACE( `{$haystack}`, '{$needle}', '' )))" .
       " / LENGTH( '{$needle}' )";
}

Použití:

// najdi 'Mauricius' v sloupci 'hotel_title'
$sql = "SELECT " . mysql_substr_count( 'hotel_title', 'Mauricius' ) . "as occurence FROM hotel";

Zdroj: http://nostylesheets.com/2009/07/17/mysql-substr-count/