Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.08.2010, 08:05   #1
Manonia
Пользователь
 
Регистрация: 13.01.2010
Сообщений: 77
По умолчанию Запрос из связанных таблиц: выбрать слово минимальной длины

Добрый день. Помогите пожалуйста составить запрос. Есть три таблицы: dictionary, dictionary_group_values и scenario. Схема бд и связи я приложила, чтобы было понятней. В общем у меня есть parent_id, у которого есть dictionary_group_id. Далее по этому dictionary_group_id я достаю keyword_id, и по keyword_id достаю keyword.
Но вся суть в том, что у одного dictionary_group_id м.б. несколько keyword_id, следовательно, одному dictionary_group_id соответствует несколько keyword, а мне нужно достать слово(keyword) с минимальной длиной.
Вот мой запрос:
Цитата:
SELECT scenario.dictionary_group_id, scenario.scenario_id, scenario.parent_id, lower(dictionary.keyword) as keyword, dictionary.keyword_id as keyword_id
FROM dictionary
INNER JOIN dictionary_group_values ON dictionary.keyword_id = dictionary_group_values.keyword_id
INNER JOIN dictionary_group ON dictionary_group_values.dictionary_ group_id = dictionary_group.dictionary_group_i d
INNER JOIN scenario ON dictionary_group.dictionary_group_i d = scenario.dictionary_group_id
WHERE scenario.parent_id=17949
order by keyword
То что получилось в итоге, тоже в приложении. Как видите, повторяются dictionary_group_id, мне же нужно получить одной значение - минимальное слово. Вот в общем вся проблема =)

Приложения не грузятся ...

Последний раз редактировалось Manonia; 24.08.2010 в 08:10.
Manonia вне форума Ответить с цитированием
Старый 24.08.2010, 10:55   #2
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

не грузятся и не надо
руками набейте сюда ддл таблиц
и какая субд?
soleil@mmc вне форума Ответить с цитированием
Старый 16.09.2010, 11:24   #3
Manonia
Пользователь
 
Регистрация: 13.01.2010
Сообщений: 77
По умолчанию

Сорри, думала без картинок никто не полезет разбираться, поэтому не заглядывала больше. Вопрос этот решился, все оказалось не так уж и сложно, сказывается маленький опыт с sql-запросами. Назрел еще вопрос, тему новую не создаю, поэтому пишу здесь: в таблице два поля - id_keyword и keyword. В поле keyword может содержаться как одно слово(phone), так и какое-то словосочетание (mobile modem type, gprs modem), которое может состоять из двух и более слов. У меня есть строка, куда пользователь вводит запрос, мне нужно проанализировать его запрос, т.е. выделить те слова или словосочетания, кот. есть в таблице. Например он ввел: i want buy gprs modem in irkutsk, нужно выделить gprs modem. Какой алгоритм здесь можно применить? есть такой вариант: делим запрос на слова, берем первое и второе, смотрим есть ли в таблице, затем первое, второе, третье ну и т.д. Возможно кто-нибудь сталкивался с подобным?
Manonia вне форума Ответить с цитированием
Старый 16.09.2010, 12:41   #4
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

все верно
берем по одному слову и подставляем в запрос
Код:
select *
from your_table
where upper(keyword) like upper(:p0)

qMatch.SQL.ParamByName('p0').AsString := '%' + l_substr + '%';
в переменную l_substr посдтавлять по очереди каждое из введенных слов
soleil@mmc вне форума Ответить с цитированием
Старый 17.09.2010, 11:30   #5
Manonia
Пользователь
 
Регистрация: 13.01.2010
Сообщений: 77
По умолчанию

Цитата:
Сообщение от soleil@mmc Посмотреть сообщение
все верно
берем по одному слову и подставляем в запрос
Код:
select *
from your_table
where upper(keyword) like upper(:p0)

qMatch.SQL.ParamByName('p0').AsString := '%' + l_substr + '%';
в переменную l_substr посдтавлять по очереди каждое из введенных слов
Спасибо. Скажите, это для какой СУБД? У меня SqlServer(+ C#).

Цитата:
Сообщение от Manonia Посмотреть сообщение
Спасибо. Скажите, это для какой СУБД? У меня SqlServer(+ C#).
Скорее всего вы писали под Дельфи? Думаю запрос можно оформить в хранимую процедуру и добавлять параметр просто.

очередной вопрос назрел : возможно ли объединить два таблицы? У меня есть 2 таблицы с двумя полями - id, word, в которых перечислены стоп-слова. Как мне можно объединить данные этих двух таблиц с помощью запроса? А вернее даже так: добавить к первой таблице слова из второй(т.к. в первой их больше), и если тако слово уже есть в таблице, то не добавлять.

Цитата:
delete from p
from WebSearch.dbo.tb_stop_words p, WebSearch.dbo.tb_stop_words t
where p.word = t.word
and p.id_word > t.id_word
... =)

Ворачиваюсь к предпоследнему вопросу, как составить запрос я поняла, мне не совсем понятно, как мне выделять слова и словосочетания из введенного запроса. Сначала я удаляю стоп слова, разбиваю предложение на массив слов. Теперь мне нужно работать только с первыми пятью словами, а именно, делать, как в математике это называется, размещения, т.е. комбинации этих слов. Только я вот не пойму, сколько же мне этих комбинаций составлять надо, по моим скромным подсчётам получилось 290 (это конечно может быть не верно). Посчитала таким образом: сначала из пяти слов комбинации по два - их получается 20, потом по три, потом по четыре, потом все пять, в сумме вышло 290 ... не могу запрограммить как составлять эти комбинации..

Последний раз редактировалось Stilet; 20.09.2010 в 08:26.
Manonia вне форума Ответить с цитированием
Старый 17.09.2010, 14:03   #6
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

какие еще комбинаций?
вы поняли что делает эта часть запроса?
Код:
where upper(keyword) like upper(:p0)
если юзер ввел предложение из 5 слов, то просто берете по очереди каждое слово (или не все 5, а только те, которые считаете нужными - типа без союзов и т.п.) и подставляете в запрос через параметр (через что вы это реализуете запрос/вьюха/ХП в дельфи/с# монопенисуально).

Цитата:
Сообщение от Manonia Посмотреть сообщение
очередной вопрос назрел : возможно ли объединить два таблицы? У меня есть 2 таблицы с двумя полями - id, word, в которых перечислены стоп-слова. Как мне можно объединить данные этих двух таблиц с помощью запроса? А вернее даже так: добавить к первой таблице слова из второй(т.к. в первой их больше), и если тако слово уже есть в таблице, то не добавлять.

... =)
а где там 2 таблицы? в вашем запросе соединяется одна и та же

Последний раз редактировалось Stilet; 20.09.2010 в 08:41.
soleil@mmc вне форума Ответить с цитированием
Старый 20.09.2010, 06:00   #7
Manonia
Пользователь
 
Регистрация: 13.01.2010
Сообщений: 77
По умолчанию

Цитата:
where upper(keyword) like upper(0)
Т.е. так: первое слво посмотреть со всеми остальными? Затем также второе?
Скорей всего, я немного не так выразилась про объединение таблиц: мне нужно было из двух таблиц сделать одну и если у них есть повторяющиеся записи, то одну из них удалить. Этот вопрос решён =)
Manonia вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[mysqld] ft_min_word_len=3 - изменение минимальной длины слова в поиске MySQL Alar SQL, базы данных 2 13.09.2020 05:21
Редактирование связанных таблиц formeram БД в Delphi 2 11.09.2009 14:11
MinLines(f), которая вставляет строку минимальной длины в начало и конец файла ArtS Паскаль, Turbo Pascal, PascalABC.NET 0 24.05.2009 19:13
sql запрос на выборку записей из двух связанных таблиц Люсьен БД в Delphi 9 20.04.2009 16:07
Диспетчер связанных таблиц АлёнаP Microsoft Office Access 2 31.03.2009 17:59