> Подсчет количества найденных документов (ну вот захотелось им
> такую фичу и все):
>
> select count(d.id) from t_documents d,
> (select w.document_id, count(1) as cnt from t_search_words w,
> ( select 2624961196 as wrd from rdb$database union
> select 1902388292 as wrd from rdb$database union
> select 1228066714 as wrd from rdb$database ) t1
> where w.lang_id=2 and w.flag=1 and w.word=t1.wrd
> group by 1 order by 2 desc ) idx
> where d.lang_id=2 and d.published_when>='01.07.2002' and
> d.published_when<='02.07.2007' and d.publisher_id =36149 and
> d.id=idx.document_id and idx.cnt=3
>
> Тут все просто - виртуальную табличку, в которой содержатся слова для
> поиска объединяем с поисковыми индексами, а результат объединения -
> объединяем с таблицей с документами. Указание найти все три слова -
> последний and . Про то, что логически правильнее
> было бы использовать union all я знаю, но ключевые слова 2 раза не
> указывают.
> Если кто сможет указать более оптимальный вариант запроса - и такой же
> понятный - буду очень признателен.
Это пробовали ?
select count(d.id) from t_documents d,
(select w.document_id, count(1) as cnt from t_search_words w
where w.lang_id=2 and w.flag=1
and w.word in (2624961196, 1902388292, 1228066714)
group by 1 order by 2 desc ) idx
where d.lang_id=2 and d.published_when>='01.07.2002' and
d.published_when<='02.07.2007'
and d.publisher_id =36149 and d.id=idx.document_id and idx.cnt=3
и\или
select count(d.id) from t_documents d
where d.lang_id=2 and d.published_when>='01.07.2002'
and d.published_when<='02.07.2007' and d.publisher_id =36149
and exists (select * from _search_words w1 where w.document_id = d.id
and w.lang_id=2 and w.flag=1 and w.word = 2624961196)
and exists (select * from _search_words w2 where w.document_id = d.id
and w.lang_id=2 and w.flag=1 and w.word = 1902388292)
and exists (select * from _search_words w3 where w.document_id = d.id
and w.lang_id=2 and w.flag=1 and w.word = 1228066714)
--
Хорсун Влад