Autor | Zpráva | ||
---|---|---|---|
Sylar Profil |
#1 · Zasláno: 31. 10. 2008, 23:17:19
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 |
#2 · Zasláno: 31. 10. 2008, 23:26:15 · Upravil/a: BetaCam
Sylar
Jen dotaz nebylo by lepší použít FULLTEXT než se s tim takhle patlat?? |
||
Sylar Profil |
#3 · Zasláno: 31. 10. 2008, 23:32:07
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 |
#4 · Zasláno: 1. 11. 2008, 00:11:33
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 |
#5 · Zasláno: 1. 11. 2008, 00:42:04 · Upravil/a: Sylar
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 |
#6 · Zasláno: 1. 11. 2008, 01:44:37 · Upravil/a: BetaCam
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 |
#7 · Zasláno: 1. 11. 2008, 02:00:59
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 |
#8 · Zasláno: 1. 11. 2008, 02:04:52
BetaCam
díky moc :-) |
||
BetaCam Profil |
#9 · Zasláno: 1. 11. 2008, 02:16:26
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 |
||
Časová prodleva: 15 let
|
0