21. září bude sraz! Od 18.00 v restauraci Tradice v Praze u Anděla
Autor Zpráva
Sylar
Profil
Zdravím,
potřeboval bych poradit. Hledám fci nebo způsob jakým vyhledávat ve sloupci slovo nebo slovní spojení a následně vypsat jeho četnost ... uživatel mi zadá slovo - nebo slovní spojení - v tom případě se rozhodnu jestli hledat AND nebo OR a já potřebuji aby mi do scriptu ta fce vyhodila kolikrát je to slovo obsaženo v tom sloupci v db. Následně tento počet budu používat v vypočetní relevance záznamu atd atd ...

Děkuji
BetaCam
Profil
Sylar

Jen dotaz nebylo by lepší použít FULLTEXT než se s tim takhle patlat??
Sylar
Profil
BetaCam
taky jsem o tom přemýšlel ale chtěl bych si udělat vlastní "tabulku" relevance a popřípadně ji jedou za čas změnit - podobně jako to dělá seznam - nehledě na to že vyhledávání fulltextem v mysql má tu 50% hranici, která se dá obejít sice IN BOOLEAN MODEem ale ten to zase automaticky neřadí dle relevance, takže to musim stejně podle něčeho řadit já sám ...
BetaCam
Profil
Sylar

No když si chceš hrát tak si hraj. Můžeš si zkusit pohrát s touhle procedurou :
DELIMITER //
 
DROP PROCEDURE IF EXISTS split_string //
CREATE PROCEDURE split_string (
    IN input TEXT
    , IN `delimiter` VARCHAR(10) 
) 
SQL SECURITY INVOKER
COMMENT 
'Splits a supplied string using using the given delimiter, 
placing values in a temporary table'
BEGIN
    DECLARE cur_position INT DEFAULT 1 ;
    DECLARE remainder TEXT;
    DECLARE cur_string VARCHAR(1000);
    DECLARE delimiter_length TINYINT UNSIGNED;
 
    DROP TEMPORARY TABLE IF EXISTS SplitValues;
    CREATE TEMPORARY TABLE SplitValues (
        value VARCHAR(1000) NOT NULL
    ) ENGINE=MyISAM;
 
    SET remainder = input;
    SET delimiter_length = CHAR_LENGTH(delimiter);
 
    WHILE CHAR_LENGTH(remainder) > 0 AND cur_position > 0 DO
        SET cur_position = INSTR(remainder, `delimiter`);
        IF cur_position = 0 THEN
            SET cur_string = remainder;
        ELSE
            SET cur_string = LEFT(remainder, cur_position - 1);
        END IF;
        IF TRIM(cur_string) != '' THEN
            INSERT INTO SplitValues VALUES (cur_string);
        END IF;
        SET remainder = SUBSTRING(remainder, cur_position + delimiter_length);
    END WHILE;
 
END //


Je trochu upravená procerura z http://forge.mysql.com/tools/tool.php?id=4

CALL split_string((SELECT sloupec FROM tabulka LIMIT 1)," ");
SELECT count(value) FROM SplitValues WHERE value = 'slovo';


Budeš to muset řešit asi nějak takto přes ruku protože pokud je mi známo tak MySql nemá žádnou funkci na spočítání výskytu nějakého slova v buňce. ( Možná má, ale já jí tedy nikdy nepotřeboval )
Sylar
Profil
BetaCam
Mno tak tady ani nejde o hraní, ale pokud to udělám přes ten BOOLEAN MODE tak jak se mi ty výsledky budou řadit? nijak, resp náhodně nebo dle data vložení ? to já nepotřebuji ... dle relevance, pak má podle mě fulltext smysl ... jinak mi taky může nejlepší odkaz kterej odpovídá mému dotazu vyskočit až na 20-tý stránce a já se na něj vůbec nemusím dostat ... proto to chci udělat, takto ... ok díky za odkaz mrknu na to :-)

Edit: // a pokud by to spočítání slov nešlo udělat v mysql tak pak by možná php stačilo ... vytáhnul bych si každej ten sloupec do php fce kde bych to zjistil, kolikrát tam to slovo je nebo není ... v php na to fce existuje ?
BetaCam
Profil
Sylar
Mno tak tady ani nejde o hraní, ale pokud to udělám přes ten BOOLEAN MODE tak jak se mi ty výsledky budou řadit?

Třeba :

SELECT sloupec, MATCH (sloupec) AGAINST ('slovo') AS relevance
FROM tabulka
WHERE
MATCH (sloupec) AGAINST ('+slovo' IN BOOLEAN MODE)
ORDER BY relevance desc;


nevim nezkoušel sem to, ale teoreticky by to tak nějak mělo jít.
BetaCam
Profil
Sylar
a pokud by to spočítání slov nešlo udělat v mysql tak pak by možná php stačilo ... vytáhnul bych si každej ten sloupec do php fce kde bych to zjistil, kolikrát tam to slovo je nebo není ... v php na to fce existuje ?

Ano je :

$string = 'slovo slovo aaa slovo';
echo substr_count($string , 'slovo'); return 3
$string = 'asdf asdf asdf as df asdf asdf sdf';
echo substr_count($string , 'slovo'); // return 0
Sylar
Profil
BetaCam
díky moc :-)
BetaCam
Profil
Sylar

Jinak ješte substr_count v podání mysql :

delimiter //
DROP FUNCTION IF EXISTS substr_count//
CREATE FUNCTION substr_count(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;


použití :

SELECT sloupec, substr_count(sloupec, 'slovo') AS pocet FROM tabulka

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