Autor Zpráva
Kcko
Profil
Dostal jsem zase jeden ze svych "genialnich" napadu, protoze uz asi roupama nemam co delat.
Mam diskusni forum, uzivatele muzou vkladat smajliky (klasika). Smajlik je oznacen jako *cislo* , napr *32* , *1* atd.
Prispevku je asi 200 tisic. Me by zajimalo, tabulka nejpouzivanejsich smajliku.

Varianta projizdet prispevek po prispevku , rozparsovat to v PHP a spocitat je neskutecne pomala.
V SQL se mi zda ze to snad ani vyresit nejde.

Nepremyslel nekdo nekdy nad touto ptakovinou?
Tomasds
Profil
Chceš o tom mít přehled průběžně, nebo ti jde o jednorázové vyhodnocení?
Jestli to potřebuješ jednorázově, tak bych ti to uměl jaksi offline zpracovat, už jsem něco podobného řešil. Potřeboval bych to jako hromadu textu. Jen nevím, jak projde export z mysql při 200k položkách.
Kcko
Profil
No asi by to bylo jednorazove jednou za cas a urcite bych Te s tim nechtel otravovat. Chtel bych znat nejake reseni krom toho co jsem navrhl.
bohyn
Profil
Kcko
Jak uz naznacil Tomasds. 1) Vyexportovat vsechny texty do jednoho souboru. 2) hledat jednotlive pocty vyskytu funkci substr_count()
Joker
Profil
bohyn
Spíš regulárním výrazem, pokud by to šlo přes normální řetězec, šlo by to i SQL dotazem; Sice nic moc, ale tohle by na počet výskytů řetězce zafungovalo:
Rozdíl délky řetězce a délky toho, co vznikne REPLACE(řetězec, hledaný řetězec, něco o 1 znak kratší než hledaný řetězec) je počet výskytů hledaného řetězce.

Tady je ale problém, že hledaný řetězec je *číslo*, což se dá leda regulárním výrazem... a MySQL (myslím) nemá replace podle regulárního výrazu.
pifko
Profil
Chvilku sem zkoušel hledat. MySQL zřejmě nemá zatím ekvivalent funkce substr_count() php. Na tomto odkazu sem našel ale její definici pro MySQL:
http://www.mmccann.com/mimicing-substr_count-in-mysql/
Já to zatím nezkoušel, ale mohlo by to možná být zajímavý.
bohyn
Profil
Joker
Rozdíl délky řetězce a délky toho, co vznikne REPLACE(řetězec, hledaný řetězec, něco o 1 znak kratší než hledaný řetězec) je počet výskytů hledaného řetězce.
No jestli tohle chces pustit na 200k radku tak ti drzim palce.

Tady je ale problém, že hledaný řetězec je *číslo*, což se dá leda regulárním výrazem... a MySQL (myslím) nemá replace podle regulárního výrazu.
Regularni vyraz nepotrebujes, cislo je taky retezec.
pifko
Profil
Tak sem zkusil definovat uvedenou funkci a pomocí ní to sečíst. Nemám ale k dispozici tabulku s velkým počtem záznamů. Můžeš to vyzkoušet a dát pak vědět, jak to bylo rychlý.
definice funkce:
delimiter $$
CREATE FUNCTION substrCount(s VARCHAR(255), ss VARCHAR(255)) RETURNS TINYINT(3) UNSIGNED LANGUAGE SQL NOT DETERMINISTIC READS SQL DATA
BEGIN
DECLARE count TINYINT(3) UNSIGNED;
DECLARE offset TINYINT(3) UNSIGNED;
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET s = NULL;

SET count = 0;
SET offset = 1;

REPEAT
IF NOT ISNULL(s) AND offset > 0 THEN
SET offset = LOCATE(ss, s, offset);
IF offset > 0 THEN
SET count = count + 1;
SET offset = offset + 1;
END IF;
END IF;
UNTIL ISNULL(s) OR offset = 0 END REPEAT;

RETURN count;
END;
$$

Bude nutný tam upravit velikost pole vstupního řetězce (předpokládám, že je to víc než 255 znaků) a pak taky nahradit TINYINT(3) UNSIGNED za třeba SMALLINT(5) UNSIGNED (kvůli rozsahu).
Pak na sečtení všech výskytů řetězce třeba *1* ze sloupce 'text' a tabulky 'prispevky' stačí jeden dotaz:
select SUM(substrCount(text, "*1*")) from prispevky;

Ještě poznámka, uvedená funkce se musí definovat v dané databázi. Já to zkoušel u sebe na počítači, nevím jak je to s definováním funkcí a procedur na hostincích.
Kcko
Profil
Heh to vypada zajimave, pres vikend vyzkousim a dam vedet. DIKY!
Kajman_
Profil *
Kcko
Myslím, že Jokerova verze s replace nebude rapidně pomalejší než takováto vlastní funkce. Pak dej vědět výsledky. Když to bude počítat taky každý smajlík zvlášť, tak to moc rozdíl nebude.

Spíš by byla rychlejší nějaká procedura na db stroji, která každý příspěvek projde jednou a do pomocné tabulky si bude dávat výsledky pro všechna čísla najednou. Případně si udělat vlastní agregační funkci s podobnou vlastností, ale to možná mysql ani neumí.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0