На основе следующей упрощенной таблицы:
CREATE TABLE Lexicon (
id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
term VARCHAR(100),
entry TEXT,
) ENGINE=InnoDB;
Как бы вы запросили в базе данных такие вещи, как термины, которых нет в их записях ? Или условия, которых нет ни в одной записи ?
Я думал об использовании FULLTEXT INDEX on Lexicon(entry)
, но AGAINST()
часть запроса MATCH()
не позволила бы мне передавать какие-либо привязки.
SELECT term FROM Lexicon
WHERE NOT MATCH(entry) AGAINST('only-literals-allowed-here' IN BOOLEAN MODE);
Итак, можно ли каким-либо образом использовать полнотекстовые индексы в подобных сценариях, или простой индекс с обычным запросом сопоставления с образцом будет единственным способом?
Например (проверка по собственной записи):
SELECT term FROM Lexicon
WHERE entry NOT LIKE CONCAT ('%', term, '%');
или еще более чудовищный (проверьте по всем записям в таблице):
SELECT LexiconB.term FROM Lexicon as LexiconA
JOIN Lexicon as LexiconB ON LexiconA.entry NOT LIKE CONCAT('%', LexiconB.term, '%')
GROUP BY LexiconB.term
HAVING COUNT(*) = (SELECT count(*) FROM Lexicon);