powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Помогите составить запрос выбора по нескольким тегам
11 сообщений из 11, страница 1 из 1
Помогите составить запрос выбора по нескольким тегам
    #38640067
roman_lenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет всем.

Нужна помощь в составлении оптимального запроса выбора значений из таблицы. Объясняю ОЧЕНЬ подробно и упрощённо.

Моя задача чем-то напоминает простой поиск по тегам, например есть упрощённая таблица отношений:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
RelationshipsTable{

    -- Идентификатор (например, статьи на сайте).
    int id,

    -- Ключевое слово (тэг), который «привязан» к идентификатору.
    varchar keyword
}



Если мне нужно выбрать из этой таблицы все идентификаторы по ключевому слову "ноутбуки", то я выполняю простейший запрос:

Код: sql
1.
select id from RelationshipsTable where keyword = 'ноутбуки';



Задача усложняется, если мне нужно выбрать идентификаторы по нескольким ключевым словам с условием AND, т.е., например мне нужны идентификаторы, которые "привязаны" и к слову "ноутбуки", и к слову "новинки" . Я пишу следующий запрос:

Код: sql
1.
2.
select id from RelationshipsTable where keyword = 'ноутбуки' and
id in (select id from RelationshipsTable where keyword = 'новинки');



Т.е., СУБД вначале выбирает все идентификаторы, соответствующие слову "новинки" , а потом из них отфильтровывает те, которые еще и соответствуют слову "ноутбуки" .

Или того круче:

Код: sql
1.
2.
3.
select id from RelationshipsTable where keyword = 'ноутбуки' and
id in (select id from RelationshipsTable where keyword = 'новинки') and
id in (select id from RelationshipsTable where keyword = 'геймерские');



Тут вообще аж трижды нужно сканировать таблицу и отсеивать результаты — ну, вы поняли к чему я ...

Т.е., как видите, запрос мой составлен и работает, но лично я не уверен, что это оптимальный вариант составления запроса — я уверен, что должен быть более умный вариант, чем мой, например, с использованием EXISTS() или каких-то других операторов. Может мне вообще нужно перепроектировать таблицу отношений. В общем, нужен компетентный совет — как улучшить мой запрос, если это вообще возможно.

Спасибо!
...
Рейтинг: 0 / 0
Помогите составить запрос выбора по нескольким тегам
    #38640126
SERG1257
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну я бы написал запрос как
Код: sql
1.
2.
select id from RelationshipsTable
where keyword = 'ноутбуки' and keyword = 'новинки' and keyword = 'геймерские'

Индекс сика (не скана) в плане было бы все равно три, но выглядело бы почеловечнее (и вероятность накосячить меньше)
...
Рейтинг: 0 / 0
Помогите составить запрос выбора по нескольким тегам
    #38640131
SERG1257
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Упс. Не прав. Не вник
...
Рейтинг: 0 / 0
Помогите составить запрос выбора по нескольким тегам
    #38640142
SERG1257
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Скорее вот так
Код: sql
1.
2.
3.
4.
5.
select id from RelationshipsTable where keyword = 'ноутбуки'
INTERSECT
select id from RelationshipsTable where keyword = 'новинки'
INTERSECT
select id from RelationshipsTable where keyword = 'геймерские'
...
Рейтинг: 0 / 0
Помогите составить запрос выбора по нескольким тегам
    #38640161
roman_lenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SERG1257Скорее вот так
Код: sql
1.
2.
3.
4.
5.
select id from RelationshipsTable where keyword = 'ноутбуки'
INTERSECT
select id from RelationshipsTable where keyword = 'новинки'
INTERSECT
select id from RelationshipsTable where keyword = 'геймерские'



Спасибо. Вроде, работает, только пока не могу определить как именно это работает — смотрю Actual Execution Plan в MS SQL Server и не понимаю. Но, всё равно спасибо — выглядит лучше тех сложных запросов, что я писал.
...
Рейтинг: 0 / 0
Помогите составить запрос выбора по нескольким тегам
    #38640163
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
roman_lenkoЗадача усложняется, если мне нужно выбрать идентификаторы по нескольким
ключевым словам с условием AND, т.е., например мне нужны идентификаторы, которые
"привязаны" и к слову "ноутбуки", и к слову "новинки".
А умные системы поиска, такие как гугль, предложат тебе не только идентификаторы, у
которых совпадают все ключевые слова, но и варианты с неполным совпадением. Они это
делают, например так:
Код: sql
1.
2.
3.
4.
select id, count(*) as "релевантность" from RelationshipsTable
where keyword = 'ноутбуки' OR keyword = 'новинки' OR keyword = 'геймерские'
group by id
order by count(*) desc


Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Помогите составить запрос выбора по нескольким тегам
    #38640187
roman_lenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry SibiryakovА умные системы поиска, такие как гугль, предложат тебе не только идентификаторы, у
которых совпадают все ключевые слова, но и варианты с неполным совпадением. Они это
делают, например так:
Код: sql
1.
2.
3.
4.
select id, count(*) as "релевантность" from RelationshipsTable
where keyword = 'ноутбуки' OR keyword = 'новинки' OR keyword = 'геймерские'
group by id
order by count(*) desc




Ну, тут не совсем та ситуация. Мне не нужно отдавать отдельно результаты для "ноутбуки", отдельно для "новинки", отдельно для "геймерские". В моей ситуации мне нужны ТОЛЬКО "ноутбуки-новинки для геймеров". Если ноутбук — НЕ новинка и НЕ геймерский — то он не подходит. Ну, а вообще, ноутбуки — это только пример — вместо этих ключевых слов могут быть другие слова.

Или я не правильно понял ваш вариант?
...
Рейтинг: 0 / 0
Помогите составить запрос выбора по нескольким тегам
    #38640204
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
roman_lenkoЕсли ноутбук — НЕ новинка и НЕ геймерский — то он не подходит.

А если этот ноутбук - новинка, но НЕ геймерский?
А если это новинка И геймерский, но НЕ ноутбук?
Варианты в которых совпадают два критерия из трёх будут идти в списке после тех, где
совпадают все три. А варианты с одним совпадающим критерием - ещё позже. Но пользователь
всегда получит хоть какие-то предложения даже если он ошибся с одним из критериев.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Помогите составить запрос выбора по нескольким тегам
    #38640209
roman_lenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry SibiryakovА если этот ноутбук - новинка, но НЕ геймерский?
А если это новинка И геймерский, но НЕ ноутбук?
Варианты в которых совпадают два критерия из трёх будут идти в списке после тех, где
совпадают все три. А варианты с одним совпадающим критерием - ещё позже. Но пользователь
всегда получит хоть какие-то предложения даже если он ошибся с одним из критериев.


Ну, если применить эту логику к другим ключевикам, например: "автомобиль", "новинка", "грузовой", то получится, что:

> А если этот автомобиль - новинка, но НЕ грузовик? — не катит (т.к., человек хочет именно грузовой автомобиль)
> А если это новинка И грузовой, но НЕ автомобиль? — не катит (т.к., грузовым может быть и поезд, и самолёт ...)

Я, вроде, понимаю о чём вы, но мне это, к сожалению, не подходит на практике. Я и так уже провёл достаточно логических оптимизаций (на стороне приложения), чтобы добиться точной определённости, что человек хочет именно то, что он запросил. Релевантность у меня тоже организована, но иначе.
...
Рейтинг: 0 / 0
Помогите составить запрос выбора по нескольким тегам
    #38640227
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
roman_lenkoЯ, вроде, понимаю о чём вы, но мне это, к сожалению, не подходит на
практике.
Потому что у тебя критериев мало. Попробуй на критериях "Вольво", "зелёный", "2005 год
выпуска", "в хорошем состоянии", "хэтчбэк", "дёшево".
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Помогите составить запрос выбора по нескольким тегам
    #38640863
Фотография DirksDR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
roman_lenko,

1.Если изменить запрос Dimitry Sibiryakov
Код: sql
1.
2.
3.
4.
select id, count(*) as "релевантность" from RelationshipsTable
where keyword = 'ноутбуки' OR keyword = 'новинки' OR keyword = 'геймерские'
group by id
having count(*)=3


получатся ТОЛЬКО "ноутбуки-новинки для геймеров".

2.У Вас три варианта запросов:
1)вложенные
2) с intersect
3) с group by
Как они отличаются по скорости выполнения?
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Помогите составить запрос выбора по нескольким тегам
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]