2011-12-21 16 views
2

私は約200語を持っています。私はその言葉が表の列に何回出現したのか見たい。テーブルの特定の列に特定の単語の出現を取得します。

たとえば、2つの行を持つ列文を持つ表テストがあるとします。

  1. 元気?私はあなたに会ってからずっとずっと続いています。
  2. 私は元気ですか。

今、「あなた」と「方法」という言葉の出現を見つけたいと思います。 「あなたは」3を持っており、どのように2行の2つの出現を持っているので、

word   count 
you   3 
how   2 

:出力のようなものでなければなりません。

どうすればいいですか?

答えて

0

あなたはこのようにそれを行うことができます。

  1. スプリットフレーズと別のテーブル内のすべてのアイテムを置きます。
  2. すべての句読点を削除します。
  3. selectは、作成するテーブルと識別する単語を使用して作成します。以下は
+0

あなたはこれをPHPを使って行うことをお勧めしますか?私はPHPを利用したくありません。私はこれをPHPでのみしたいと思います。出来ますか?これを行うことができれば、mysqlだけです。例を挙げてください。 – Gaurav

+1

文字列分割関数を持たないため、これはMySQLだけでは不可能です。しかし、おそらく独自の関数を書くことは可能です。このようなもの:http://blog.fedecarg.com/2009/02/22/mysql-split-string-function/ – Minras

+1

@ミナス:それは単に真実ではありません。ループと[SUBSTRING_INDEX()](http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_substring-index)を使用すると、デリミタ上の文字列が爆発する可能性があります。 PerlやPHPのような言語ではもっと簡単に*できますが、純粋にMySQLで何かできることはあります。 –

-1

あなたが特定の単語の出現ではなく、完全な統計情報をカウントする必要があるときにケースのためのシンプルなソリューションです:私はこれに近づくだろう

SELECT COUNT(*) FROM `words` WHERE `row1` LIKE '%how%'; 
SELECT COUNT(*) FROM `words` WHERE `row1` LIKE '%you%'; 
+0

お返事ありがとうございますが、私はすでに知っているこの事は非常に基本的です。同様に、検索する単語が200語ある場合は、200のクエリを実行する必要がありますが、これは嫌です。 – Gaurav

+0

@Minras:上の例を見ると、あなたの解決策が間違った答えをしていることがわかります。これは、単語の出現ごとに1つではなく、検索された単語を持つ行ごとに1を返します。あなたの2番目のクエリは2を与えますが、それは* 3に与えるべきです。 –

0

の方法は、私を与えるために少し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; 
+0

ありがとう、私はそれを与えるでしょう。 – Gaurav

0

は解決策である:ここでは

SELECT SUM(total_count) as total, value 
FROM (

SELECT count(*) AS total_count, REPLACE(REPLACE(REPLACE(x.value,'?',''),'.',''),'!','') as value 
FROM (
SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(t.sentence, ' ', n.n), ' ', -1) value 
    FROM table_name t CROSS JOIN 
(
    SELECT a.N + b.N * 10 + 1 n 
    FROM 
    (SELECT 0 AS N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) a 
    ,(SELECT 0 AS N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) b 
    ORDER BY n 
) n 
WHERE n.n <= 1 + (LENGTH(t.sentence) - LENGTH(REPLACE(t.sentence, ' ', ''))) 
ORDER BY value 

) AS x 
GROUP BY x.value 

) AS y 
GROUP BY value 

は完全な作業フィドルです:http://sqlfiddle.com/#!2/17481a/1

最初に、説明されているすべての単語を@petermで説明したhereというクエリを実行します(処理する単語の総数をカスタマイズする場合は、指示に従います)。次にそれをサブクエリに変換して、COUNTGROUP BYの各単語の値を変換し、さらにその上に別のクエリを作成して、GROUP BYにグループ化されていない単語が付いていない場合があります。すなわち:hello = hello! REPLACE

関連する問題