Поиск в БД по нескольким запрашиваемым словам

Работа VB и СУБД (Access, MSSQL, MySQL, Oracle и пр.)
Правила форума
При создании новой темы не забывайте указывать используемую СУБД.
Cnoppiks
Обычный пользователь
Обычный пользователь
 
Сообщения: 89
Зарегистрирован: 17.08.2005 (Ср) 17:52

Поиск в БД по нескольким запрашиваемым словам

Сообщение Cnoppiks » 31.08.2005 (Ср) 12:59

Доброго дня!!
Подскажите пожалуйста, каким образом реализовывается поиск по БД по нескольким словам, веденным пользователем в InputBox.
Если SQL - запросом, к примеру, для двух слов - то пересечением полученных множеств EXISTS наверное:

strSQL = "select DISTINCT * from table1 where vid Like '*дата1*'" And EXISTS("Select * from table1 where vid like '*дата2*'")

Не получается..-(
А если слов больше двух??!!!!!

Спасибо!
Хочу все знать....

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 31.08.2005 (Ср) 13:10

Код: Выделить всё
vid like '%первое%' and vid like '%второе%'

Cnoppiks
Обычный пользователь
Обычный пользователь
 
Сообщения: 89
Зарегистрирован: 17.08.2005 (Ср) 17:52

Сообщение Cnoppiks » 31.08.2005 (Ср) 13:17

Да, логично, спасиб, Konst_One !!!!!
Может подкините кто нить мысль, как имея массив значений сделать запрос по этим значениям??
Хочу все знать....

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 31.08.2005 (Ср) 13:17

Код: Выделить всё
--Поиск в режиме "любое из":
select *
from Table1
where Vid like 'pattern1'
UNION
select *
from Table1
where Vid like 'pattern2'
...
-- Поиск в режиме "все слова":
select *
from Table1
where Vid like 'pattern1'
  and Vid like 'pattern2'
  ...

В принципе, юнион в первом случае эквивалентен использованию OR по аналогии со вторым примером (вместо AND). Однако, на практике разные сервера по-разному строят план выполнения таких напросов. В случае MS SQL Server, например, использование OR в условиях отбора вообще убивает производительность, поэтому я и привел более громоздкий вариант с объединением - на сиквеле он будет быстрее.

Cnoppiks
Обычный пользователь
Обычный пользователь
 
Сообщения: 89
Зарегистрирован: 17.08.2005 (Ср) 17:52

Сообщение Cnoppiks » 31.08.2005 (Ср) 13:21

Ennor
Спасиба!!!
Уже получилось!!
Подсоби,пжлст, со вторым вопросом, он поинтереснее-)!!
Хочу все знать....

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 31.08.2005 (Ср) 13:31

Сбрасываешь свои значения во временную (ну или постоянную, разница в общем непринципиальная) таблицу, после чего можешь кинуть на нее прямой джойн, а можешь сделать через EXISTS:
Код: Выделить всё
select *
from Table1 T
where exists (
  select 0 from #tmp_Patterns P
  where T.Vid like P.Pattern
)

Cnoppiks
Обычный пользователь
Обычный пользователь
 
Сообщения: 89
Зарегистрирован: 17.08.2005 (Ср) 17:52

Сообщение Cnoppiks » 31.08.2005 (Ср) 13:34

Крута!!
Сейчас попробую.
Лаблагодарю -)
Хочу все знать....

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 01.09.2005 (Чт) 8:29

[quote="Ennor"]
Код: Выделить всё

-- Поиск в режиме "все слова":
select *
from Table1
where Vid like 'pattern1'
  and Vid like 'pattern2'
  ...


Вообще-то можно:

Код: Выделить всё
select *
from Table1
where Vid IN('pattern1','pattern2')
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 01.09.2005 (Чт) 10:11

Andrey Fedorov писал(а):Вообще-то можно:

Код: Выделить всё
select *
from Table1
where Vid IN('pattern1','pattern2')

Сравнение по шаблону так работать не будет. По точному совпадению - да, без проблем, хотя при большом количестве слов вариант с временной таблицей будет быстрее. А вот если у тебя стоит LIKE '%somestr' - упс.

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 01.09.2005 (Чт) 10:21

Ennor писал(а):
Andrey Fedorov писал(а):Вообще-то можно:

Код: Выделить всё
select *
from Table1
where Vid IN('pattern1','pattern2')

Сравнение по шаблону так работать не будет. По точному совпадению - да, без проблем, хотя при большом количестве слов вариант с временной таблицей будет быстрее. А вот если у тебя стоит LIKE '%somestr' - упс.


Ну у тебя и было точное совпадение - его аналог я и написал ;)
Кстати оно регистронечуствительное...
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

Cnoppiks
Обычный пользователь
Обычный пользователь
 
Сообщения: 89
Зарегистрирован: 17.08.2005 (Ср) 17:52

Сообщение Cnoppiks » 01.09.2005 (Чт) 10:59

Доброго времени суток всем!!
Вы знаете, все работает обоими способами со знаком равенства, но Like не пашет. Не могу понять - почему...

strSQL = "select * from Table1 where Exists(Select * from Words where Words.Word Like Table1.Vid)"

Таблица Words формируется из введенных пользователем слов для поиска, т.е. содержит один столбец Word, к примеру -
слово1
слово2
,,,

А таблица - Table1 - из готовых наименований, содержащих в себе слова из таблицы Word.
Хочу все знать....

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 01.09.2005 (Чт) 11:09

Во вложенном запросе поля поменяй местами вокруг LIKE.

Cnoppiks
Обычный пользователь
Обычный пользователь
 
Сообщения: 89
Зарегистрирован: 17.08.2005 (Ср) 17:52

Сообщение Cnoppiks » 01.09.2005 (Чт) 11:14

Ну да, в смысле
strSQL = "select * from Table1 where Exists(Select * from Words where Table1.Vid Like Words.Word)"
С Inner Join то же самое
Но все равно не помогает...

Рез-т запроса я вывожу
Me.RecordSource = strSQL

Ладно, щас что нить придумаю
Хочу все знать....

Cnoppiks
Обычный пользователь
Обычный пользователь
 
Сообщения: 89
Зарегистрирован: 17.08.2005 (Ср) 17:52

Сообщение Cnoppiks » 01.09.2005 (Чт) 14:55

Простите за назойливость.
Точно Like работает в таких формулировках запроса как inner join и exists?
Потому что в любом случае у меня вывод получается как со знаком равенства, даже если Like указан.
Хочу все знать....

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 01.09.2005 (Чт) 15:15

А чему равен Table1.Vid?
Lasciate ogni speranza, voi ch'entrate.

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 02.09.2005 (Пт) 0:52

..., а заодно и Words.Word. Т.к. у меня в точности такая же конструкция прекрасно работает. Учти, в этом поле должна быть маска поиска, иначе ты никогда ничего не найдешь, кроме случаев полного совпадения Vid и Word.

Да, еще - СУБД какая? А то сейчас выяснится, что в ней оператор EXISTS, как бы это... not exists :).

2Andrey Fedorov Насчет чувствительности к регистру - в том же MSSQL2K режим сравнения:
    1. Определяется дефолтным коллейшном базы;
    2. Может быть переопределен в каждом конкретном месте по желанию программера:
Код: Выделить всё
WHERE Table1.CharField LIKE 'Проблема%' COLLATE Cyrillic_General_CS_AI
  and Table1.CharField != 'Тест'

В этом примере в первом условии включен учет регистра, но отключен учет диакритики (А <> а, й = и), а во втором используется дефолтный режим для текущей базы.

Cnoppiks
Обычный пользователь
Обычный пользователь
 
Сообщения: 89
Зарегистрирован: 17.08.2005 (Ср) 17:52

Сообщение Cnoppiks » 02.09.2005 (Пт) 8:28

БД - Access 2003. VBA 6.3 . Exists поддерживается, потому что проходит сравнение равенства. Да и с Inner Join не получается.
А как реализовывается маска поиска? Может правда в этом дело?
Table1.Vid
-Окна и двери из ПВХ и алюминия (производство, монтаж, сервис, остекление балконов (в том числе безрамное)

-Двери, окна, автоматика

-Бытовые покрытия Интерьерные материалы Объектные покрытия.

и т.д.

Words.Word(к примеру)
Двери
Окна

Должна по идее выбрать первые два предложения...
А не выбирается ничего.

Часть кода:
strSQL = "select * from Vizitki INNER JOIN Words on Words.Word Like Vizitki.Vid" или
strSQL = "Select * from Vizitki where Exists(Select * from Words where Words.Word Like Vizitki.Vid)"
Me.RecordSource = strSQL
Хочу все знать....

Cnoppiks
Обычный пользователь
Обычный пользователь
 
Сообщения: 89
Зарегистрирован: 17.08.2005 (Ср) 17:52

Сообщение Cnoppiks » 02.09.2005 (Пт) 9:33

Ennor
Ты имеешь в виду под маской поиска, что слова для поиска должны быть внесены в Words.Word в виде '*окна*' и т.д.?
Хочу все знать....

Cnoppiks
Обычный пользователь
Обычный пользователь
 
Сообщения: 89
Зарегистрирован: 17.08.2005 (Ср) 17:52

Сообщение Cnoppiks » 02.09.2005 (Пт) 9:56

Так, вводить надо в виде *окна*. Получился поиск, но теперь он ищет хотя бы одно слово в строке.
А как сделать, чтоб поиск велся по целой колонке слов из Words.Word? По аналогии с INTERSECT(пересечение), если бы он работал в Access...
Хочу все знать....

SK | Heaton
Обычный пользователь
Обычный пользователь
 
Сообщения: 63
Зарегистрирован: 16.08.2005 (Вт) 10:10

Сообщение SK | Heaton » 02.09.2005 (Пт) 12:57

А как из этих запросов сделать ОДНУ! Чтоб и этот и тот запрос одно времено работал
Код: Выделить всё
Adodc1.RecordSource = "select * from data where date>=" + d1 + " and date<=" + d2 + " "

Adodc1.RecordSource = "select sim, cityid, sum, date from data ORDER

Adodc1.Refresh
============================
Учимся кодить
============================

Cnoppiks
Обычный пользователь
Обычный пользователь
 
Сообщения: 89
Зарегистрирован: 17.08.2005 (Ср) 17:52

Сообщение Cnoppiks » 02.09.2005 (Пт) 13:10

SK | Heaton

А это ты к чему написал то??Там кроется разгадка моей тайны?-) Вообще то из этого можно сформировать один запрос
Хочу все знать....

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 02.09.2005 (Пт) 13:16

А у тебя какие требования?
Поиск по любому слову и поиск по всем словам?
Или есть опция "показывать, если соответствует двум и более словам"?
Lasciate ogni speranza, voi ch'entrate.

Cnoppiks
Обычный пользователь
Обычный пользователь
 
Сообщения: 89
Зарегистрирован: 17.08.2005 (Ср) 17:52

Сообщение Cnoppiks » 02.09.2005 (Пт) 13:21

Хотелось бы чтоб искались recordsetы с присутствием всех слов из поисковой таблицы, ну т.е. чтоб искались все слова сразу
Хочу все знать....

SK | Heaton
Обычный пользователь
Обычный пользователь
 
Сообщения: 63
Зарегистрирован: 16.08.2005 (Вт) 10:10

Сообщение SK | Heaton » 02.09.2005 (Пт) 13:30

ну хелпните кто нить...
============================
Учимся кодить
============================

Cnoppiks
Обычный пользователь
Обычный пользователь
 
Сообщения: 89
Зарегистрирован: 17.08.2005 (Ср) 17:52

Сообщение Cnoppiks » 02.09.2005 (Пт) 13:39

SK | Heaton

Adodc1.RecordSource = "select sim, cityid, sum, date from data where date>=" + d1 + " and date<=" + d2 + " "
Adodc1.Refresh

ТАк не прокатит?
Хочу все знать....

SK | Heaton
Обычный пользователь
Обычный пользователь
 
Сообщения: 63
Зарегистрирован: 16.08.2005 (Вт) 10:10

Сообщение SK | Heaton » 02.09.2005 (Пт) 13:40

я тут почитал о UNION-не ну все равно не получается как мне записать это в Adodc1.RecordSource :?: :?:
============================
Учимся кодить
============================

Cnoppiks
Обычный пользователь
Обычный пользователь
 
Сообщения: 89
Зарегистрирован: 17.08.2005 (Ср) 17:52

Сообщение Cnoppiks » 02.09.2005 (Пт) 13:42

SK | Heaton

А чего сделать то надобно тебе??
По вопросу если судить - то просто выборка обыкновенная полей с условием ограничения по d1 и d2..
Хочу все знать....

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 02.09.2005 (Пт) 13:45

В таком случае можно попытаться слинковать эти две таблицы (со словом и словоформами, линковать через LIKE), а в запросе сделать группировку и фильтровать по HAVING BY Count(Table1.Vid)>1
Lasciate ogni speranza, voi ch'entrate.

SK | Heaton
Обычный пользователь
Обычный пользователь
 
Сообщения: 63
Зарегистрирован: 16.08.2005 (Вт) 10:10

Сообщение SK | Heaton » 02.09.2005 (Пт) 13:50

Cnoppiks не..
Столбцы в 2 запросах одинаковый я просто хочу, выполнялись сразу 2 запросы чтоб упорядочить по дате и по символу. Вот например пошел перый запрос, они мне сделал сортировку по дате (с **.**.**** до **.**.****), а после хочу чтоб с этой жи полученной таблицы запустить 2 запрос.

Я когда запускаю 2 запрос она сортирует всю таблицу :cry:
============================
Учимся кодить
============================

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 02.09.2005 (Пт) 14:05

Ничё не понял.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

След.

Вернуться в Базы данных

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот и гости: 2

    TopList