Я пытаюсь присоединиться к двум таблицам - позвоните им table1
и table2
- в MySQL на основе текстового столбца в каждой таблице. table1.text
- это все предложения, и мне нужно присоединиться к table2.text
где слово или фраза из table2.text
появляется в предложении для первой.
table2.text
часть заключается в том, что фраза из table2.text
окружена **
, тогда она должна быть точным соответствием для этого слова. Если нет, и это просто нормальная фраза, это может быть регулярное совпадение - поэтому такое слово, как can
в table2.text
будет соответствовать предложению, которое у I have cans
в table1.text
. Однако **can**
в table2.text
бы у I have cans
не I have cans
в table1.text
.
До сих пор я думал об этом:
select a.text, replace(b.text,'**',' ')
from table1 a join
table2 b
on a.text like CONCAT('%', b.text, '%');
Но это не учитывает **
слова, которые появляются в начале предложения или перед пунктуацией. Есть идеи?
Этот запрос будет делать то, что вы хотите. Он проверяет значение table2.text
чтобы увидеть, соответствует ли оно **word**
, а если нет, просто использует LIKE
чтобы посмотреть, находится ли это слово в table1.text
. Если table2.text
соответствует table2.text
**word**
, он использует тест REGEXP
чтобы гарантировать, что table2.text
возникает только в table1.text
как целое слово (используя [[:<:]]
и [[:>:]]
разделителей слов). Я привел некоторые примеры данных для демонстрации в этом SQLFiddle.
SELECT a.text, REPLACE(b.text, '**', '')
FROM table1 a
JOIN table2 b
ON b.text NOT REGEXP('\\*\\*[a-z]+\\*\\*') AND a.text LIKE CONCAT('%', b.text, '%') OR
a.text REGEXP CONCAT('[[:<:]]', REPLACE(b.text, '**', ''), '[[:>:]]')
Если я выясню вашу проблему, возможно, это будет что-то вроде этого.
SELECT a.text, replace(b.text,'**',' ')
FROM table1 a, table2 b
WHERE REGEXP_LIKE (a.text, b.text);