> Подсчет количества найденных документов (ну вот захотелось им
> такую фичу и все):
>
> 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)
--
Хорсун Влад


Ответить