Привет!

>> 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

> Извините, что влезаю,

Это публичная конференция, тут каждый сам решает - присоединяться к
ветке или нет.  :)

> но никак не могу понять, зачем order by 2 desc в idx?

"order by 2 desc" - сортировка по второму полю (количество ключевых
слов, найденных в документе). Это общая конструкция - на нее может, а
может и не, накладываться условие отсечения and cnt=3 (3 - это
количество ключевых слов в данном случае). Грубо (абсолютно не точно)
- это сортировка по "релевантности" - т.е. документы, в которых
встречаются 3 из 3-х слов идут первыми, затем те, в которых 2 из 3 и
т.д. У гугла понятие релевантности отличается - как и у яндекса.


> Правильно ли я понимаю, что Ваш запрос эквивалентен следующему:
> select count(1)  from t_documents d,
>         (select w.document_id 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
>          Having Count(1) = 3 ) 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 ?

Правильно. Но первый вариант мне почему-то нравится больше и order by
2 desc тут не смотрится :)


> или, если взять за основу вариант Влада Хорсуна,

> select count(1)  from t_documents d,
>         (select w.document_id from t_search_words w cross join rdb$database
>           where w.lang_id=2 and w.flag=1
>              and w.word in (2624961196, 1902388292, 1228066714)
>          group by 1
>          having Count(1) = 3) 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 ?

Запрос с IN(), как я показал - в моем случае тормознутее :))



-- 
Best regards,
 Sergey                            mailto:[EMAIL PROTECTED]


Ответить