の方法は、私を与えるために少しuser defined functionを書くことです
- 大文字と小文字
- 共通句読点
:回数は、1つの文字列はのためのいくつかの手当を持つ別に表示されます。
これで、検索したいすべての単語、つまり200個のリストを含む表が作成されます。次に、この機能を使用して、各フレーズの各単語の出現回数をカウントし、インラインビューに入れて、検索結果で結果を合計します。したがって
:あなたはこの機能を使用すると、句読点やケースのために作るために必要な手当ものに応じて少しプレイしている場合があります
ユーザー定義関数
DELIMITER $$
CREATE FUNCTION `get_word_count`(phrase VARCHAR(500),word VARCHAR(255), delimiter VARCHAR(1)) RETURNS int(11)
READS SQL DATA
BEGIN
DECLARE cur_position INT DEFAULT 1 ;
DECLARE remainder TEXT;
DECLARE cur_string VARCHAR(255);
DECLARE delimiter_length TINYINT UNSIGNED;
DECLARE total INT;
DECLARE result DOUBLE DEFAULT 0;
DECLARE string2 VARCHAR(255);
SET remainder = replace(phrase,'!',' ');
SET remainder = replace(remainder,'.',' ');
SET remainder = replace(remainder,',',' ');
SET remainder = replace(remainder,'?',' ');
SET remainder = replace(remainder,':',' ');
SET remainder = replace(remainder,'(',' ');
SET remainder = lower(remainder);
SET string2 = concat(delimiter,trim(word),delimiter);
SET delimiter_length = CHAR_LENGTH(delimiter);
SET cur_position = 1;
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 = concat(delimiter,LEFT(remainder, cur_position - 1),delimiter);
END IF;
IF TRIM(cur_string) != '' THEN
set result = result + (select instr(string2,cur_string) > 0);
END IF;
SET remainder = SUBSTRING(remainder, cur_position + delimiter_length);
END WHILE;
RETURN result;
END$$
DELIMITER ;
。うまくいけば、あなたはここでアイデアを得るでしょう!ここで
移入テーブル
create table search_word
(id int unsigned primary key auto_increment,
word varchar(250) not null
);
insert into search_word (word) values ('you');
insert into search_word (word) values ('how');
insert into search_word (word) values ('to');
insert into search_word (word) values ('too');
insert into search_word (word) values ('the');
insert into search_word (word) values ('and');
insert into search_word (word) values ('world');
insert into search_word (word) values ('hello');
create table phrase_to_search
(id int unsigned primary key auto_increment,
phrase varchar(500) not null
);
insert into phrase_to_search (phrase) values ("How are you. It's been long since I met you");
insert into phrase_to_search (phrase) values ("I am fine how are you?");
insert into phrase_to_search (phrase) values ("Oh. Not bad. All is ok with the world, I think");
insert into phrase_to_search (phrase) values ("I think so too!");
insert into phrase_to_search (phrase) values ("You know what? I think so too!");
クエリの実行
select word,sum(word_count) as total_word_count
from
(
select phrase,word,get_word_count(phrase,word," ") as word_count
from search_word
join phrase_to_search
) t
group by word
order by total_word_count desc;
あなたはこれをPHPを使って行うことをお勧めしますか?私はPHPを利用したくありません。私はこれをPHPでのみしたいと思います。出来ますか?これを行うことができれば、mysqlだけです。例を挙げてください。 – Gaurav
文字列分割関数を持たないため、これはMySQLだけでは不可能です。しかし、おそらく独自の関数を書くことは可能です。このようなもの:http://blog.fedecarg.com/2009/02/22/mysql-split-string-function/ – Minras
@ミナス:それは単に真実ではありません。ループと[SUBSTRING_INDEX()](http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_substring-index)を使用すると、デリミタ上の文字列が爆発する可能性があります。 PerlやPHPのような言語ではもっと簡単に*できますが、純粋にMySQLで何かできることはあります。 –