2010-09-21 26 views
0

的另一个表假设我有两个表:交叉检查的文本内容,一个MySQL表对关键字

表1有列NOTE_ID(唯一的密钥)和NOTE_BODY(大文本的Blurb)。

表2具有KEYWORD_ID(唯一键)和KEYWORD(关键字)的列。

我想得到一个结果集,告诉我每个NOTE_BODY包含哪些关键字,而无需嵌套一堆循环。所以理想情况下,我会为每个NOTE_BODY-KEYWORD匹配获得一行。

什么是正确的方式去做这件事?我不确定JOIN + LIKE'%%'是否能解决这个问题,或者我是否应该使用全文索引。任何帮助非常感谢...

回答

2

如果您计划有很多行,全文索引解决方案是正确的方法。如果您使用的是MyISAM存储引擎,则可以使用MySQL's native solution,但您也可以考虑使用流行的第三方搜索引擎SphinxApache Lucene

。另一方面,一个简单的INNER JOIN会做的伎俩:

SELECT t1.note_id, t1.note_body, t2.keyword 
FROM table_1 t1 
JOIN table_2 t2 ON (t1.note_body LIKE CONCAT('%', t2.keyword, '%')); 

测试用例:

CREATE TABLE table_1 (note_id int, note_body varchar(100)); 
CREATE TABLE table_2 (keyword_id int, keyword varchar(50)); 

INSERT INTO table_1 VALUES (1, 'Hello Stack Overflow'); 
INSERT INTO table_1 VALUES (2, 'Hello World'); 
INSERT INTO table_1 VALUES (3, 'Hello, my name is Daniel'); 
INSERT INTO table_1 VALUES (4, 'Goodbye'); 

INSERT INTO table_2 VALUES (1, 'Hello'); 
INSERT INTO table_2 VALUES (2, 'name'); 

结果:

+---------+--------------------------+---------+ 
| note_id | note_body    | keyword | 
+---------+--------------------------+---------+ 
|  1 | Hello Stack Overflow  | Hello | 
|  2 | Hello World    | Hello | 
|  3 | Hello, my name is Daniel | Hello | 
|  3 | Hello, my name is Daniel | name | 
+---------+--------------------------+---------+ 
4 rows in set (0.00 sec) 
+0

真棒,谢谢。我会去索引选项,但也很好地知道,如果涉及的数据集足够小(经过多次尝试,我仍然无法保持JOIN的直线...),那么加入会处理它。 – NChase 2010-09-21 08:40:07