Есть таблица, пусть, для простоты, вида: keyword_id, object_id
Т.е. таблица привязок ключевых слов к объектам.
Есть список ключевых слов. Нужно найти список объектов, к которым привязаны все эти слова.
Первое, что приходит в голову, конструкция типа
SELECT DISTINCT object_id FROM tab t0 INNER JOIN tab t1 ON t1.object_id = t0.object_id AND t1.keyword_id = kw1 INNER JOIN tab t2 ON t2.object_id = t0.object_id AND t2.keyword_id = kw2 INNER JOIN tab t3 ... WHERE t0.keyword_id = t0;
Но это кошмар. И работает ужасно медленно. На весьма мощной машине запрос по двум ключевым словам выполняется 6-7 секунд.
Если подумать, то приходит в голову другой вариант. В духе:
SELECT object_id FROM tab WHERE keyword_id in (kw1,kw2,...,kwN) GROUP BY object_id HAVING COUNT(*) = N;
Этот вариант уже заметно красивее и достаточно быстро работает (0,1сек в моём случае). Однако, всё равно остаются 0,1 сек. и файловая сортировка в explain.
Нет ли ещё какого-то более изящного решения?