2017-02-06 7 views
0

私は2つのテーブルを持っています。私はそれを行うことができる唯一の方法は、2つの別々のループを持つことである現時点でMYSQL/PHPは別のテーブルのテキストのスニペットに基づいて結合します

 
Table A (documents): 
+-------------+----------------------------+ 
| document_id | document_text    | 
+-------------+----------------------------+ 
| 1   | My favorite color is blue | 
+-------------+----------------------------+ 
| 2   | My favorite color is green | 
+-------------+----------------------------+ 
| 3   | Yellow is my favorite  | 
+-------------+----------------------------+ 
| 4   | I like all colors   | 
+-------------+----------------------------+ 
 
Table B (snippet): 
+------------+--------------+ 
| snippet_id | snippet_text | 
+------------+--------------+ 
| 1   | orange  | 
+------------+--------------+ 
| 2   | black  | 
+------------+--------------+ 
| 3   | yellow  | 
+------------+--------------+ 
| 4   | green  | 
+------------+--------------+ 
| 5   | blue   | 
+------------+--------------+ 

:私は2番目のテーブルに含まれるテキストの抜粋に基づいてテーブルを結合するための効率的な方法を見つけようとしています私のスクリプトには最初のものがテーブルBにあり、次にもう1つはテーブルBから得られたスニペットに基づいてテーブルAに問い合わせるものです。

実際の世界のデータでは、スニペットは長い文章であり、テーブルAは多くのテキストを含む数千の行が含まれています。

mysqlクエリで実行しようとすると、データがあまりない場合でもロードに3分以上かかります。

SELECT * FROM table_b left join table_a on document_text LIKE CONCAT('%', snippet_text, '%') 

ので、サンプルデータと、所望の結果が

 
+-------------+----------------------------+-----------+ 
| document_id | document_text    | snippet_id | 
+-------------+----------------------------+-----------+ 
| 1   | My favorite color is blue | 5   | 
+-------------+----------------------------+-----------+ 
| 2   | My favorite color is green | 4   | 
+-------------+----------------------------+-----------+ 
| 3   | Yellow is my favorite  | 3   | 
+-------------+----------------------------+-----------+ 
| 4   | I like all colors   | NULL  | 
+-------------+----------------------------+-----------+ 
+0

https://dev.mysql.com/doc/refman/5.7/en/fulltext-search.html – GurV

+0

こんにちは、私はそれについて読んできましたが、フルテキスト検索でテーブルを結合する方法を理解できません。私は正確に一致する文章が必要です。 – user3163357

答えて

0

迅速な方法それをするためには、PHPでイテレータを作成し、2番目のクエリからJOINを削除しているだろう。あなたがイテレータを使用している場合は、PHPの中で、foreachを使用するよりもテーブルのコスト(時間)の間の関係を使用します。

私をフォークしないでください!

0

あなたはここに挑戦しています。 MySQLはfull text searchをサポートしていますが、検索条件は定数である必要があります。

snippetsで外側ループを実行することをお勧めします。ループの内部では、「スニペット」を2つのステップで検索します.1つはmatchを使用し、もう1つはlikeを使用します(前者は2番目の行の数を減らします)。次に、スニペットIDをそれらに割り当てます。

ので、これを繰り返し行います。

select d.*, @snippetId 
from (select d.* 
     from documents d 
     where match (d.document) against (. . .) 
    ) d 
where d.document like ('%', @snippet, '%') 
0

あなたは、MySQLのlocate機能を行うことができ、例えば:

SELECT d.id, d.document, s.id 
FROM documents d LEFT JOIN snippet s 
ON LOCATE(s.snippet_text, d.document) <> 0 
ORDER BY d.id; 

Herelocate機能のマニュアルを。

関連する問題