Скажем, у меня две таблицы:
В таблице 1 указаны столбцы NOTE_ID (уникальный ключ) и NOTE_BODY (большой текстовый фрагмент).
Таблица 2 содержит столбцы KEYWORD_ID (уникальный ключ) и KEYWORD (ключевое слово).
Я хочу получить набор результатов, который сообщает мне, какие ключевые слова содержат каждый NOTE_BODY, не вставляя кучу циклов. Поэтому в идеале я бы получил строку для каждого соответствия NOTE_BODY-KEYWORD.
Каков правильный путь? Я не уверен, что JOIN + LIKE '%%' делает трюк, или если я должен использовать полнотекстовую индексацию. Любая помощь очень ценится...
Полнотекстовое индексирование - это правильный способ сделать это, если вы планируете иметь много строк. Вы можете использовать родное решение MySQL, если вы используете MyISAM, но вы также можете рассмотреть популярные сторонние поисковые системы Sphinx и Apache 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 Qaru | 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)