|
|
|
Помогите составить запрос выбора по нескольким тегам
|
|||
|---|---|---|---|
|
#18+
Привет всем. Нужна помощь в составлении оптимального запроса выбора значений из таблицы. Объясняю ОЧЕНЬ подробно и упрощённо. Моя задача чем-то напоминает простой поиск по тегам, например есть упрощённая таблица отношений: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. Если мне нужно выбрать из этой таблицы все идентификаторы по ключевому слову "ноутбуки", то я выполняю простейший запрос: Код: sql 1. Задача усложняется, если мне нужно выбрать идентификаторы по нескольким ключевым словам с условием AND, т.е., например мне нужны идентификаторы, которые "привязаны" и к слову "ноутбуки", и к слову "новинки" . Я пишу следующий запрос: Код: sql 1. 2. Т.е., СУБД вначале выбирает все идентификаторы, соответствующие слову "новинки" , а потом из них отфильтровывает те, которые еще и соответствуют слову "ноутбуки" . Или того круче: Код: sql 1. 2. 3. Тут вообще аж трижды нужно сканировать таблицу и отсеивать результаты — ну, вы поняли к чему я ... Т.е., как видите, запрос мой составлен и работает, но лично я не уверен, что это оптимальный вариант составления запроса — я уверен, что должен быть более умный вариант, чем мой, например, с использованием EXISTS() или каких-то других операторов. Может мне вообще нужно перепроектировать таблицу отношений. В общем, нужен компетентный совет — как улучшить мой запрос, если это вообще возможно. Спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2014, 17:18 |
|
||
|
Помогите составить запрос выбора по нескольким тегам
|
|||
|---|---|---|---|
|
#18+
Ну я бы написал запрос как Код: sql 1. 2. Индекс сика (не скана) в плане было бы все равно три, но выглядело бы почеловечнее (и вероятность накосячить меньше) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2014, 17:56 |
|
||
|
Помогите составить запрос выбора по нескольким тегам
|
|||
|---|---|---|---|
|
#18+
Упс. Не прав. Не вник ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2014, 17:58 |
|
||
|
Помогите составить запрос выбора по нескольким тегам
|
|||
|---|---|---|---|
|
#18+
Скорее вот так Код: sql 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2014, 18:07 |
|
||
|
Помогите составить запрос выбора по нескольким тегам
|
|||
|---|---|---|---|
|
#18+
SERG1257Скорее вот так Код: sql 1. 2. 3. 4. 5. Спасибо. Вроде, работает, только пока не могу определить как именно это работает — смотрю Actual Execution Plan в MS SQL Server и не понимаю. Но, всё равно спасибо — выглядит лучше тех сложных запросов, что я писал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2014, 18:23 |
|
||
|
Помогите составить запрос выбора по нескольким тегам
|
|||
|---|---|---|---|
|
#18+
roman_lenkoЗадача усложняется, если мне нужно выбрать идентификаторы по нескольким ключевым словам с условием AND, т.е., например мне нужны идентификаторы, которые "привязаны" и к слову "ноутбуки", и к слову "новинки". А умные системы поиска, такие как гугль, предложат тебе не только идентификаторы, у которых совпадают все ключевые слова, но и варианты с неполным совпадением. Они это делают, например так: Код: sql 1. 2. 3. 4. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2014, 18:26 |
|
||
|
Помогите составить запрос выбора по нескольким тегам
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovА умные системы поиска, такие как гугль, предложат тебе не только идентификаторы, у которых совпадают все ключевые слова, но и варианты с неполным совпадением. Они это делают, например так: Код: sql 1. 2. 3. 4. Ну, тут не совсем та ситуация. Мне не нужно отдавать отдельно результаты для "ноутбуки", отдельно для "новинки", отдельно для "геймерские". В моей ситуации мне нужны ТОЛЬКО "ноутбуки-новинки для геймеров". Если ноутбук — НЕ новинка и НЕ геймерский — то он не подходит. Ну, а вообще, ноутбуки — это только пример — вместо этих ключевых слов могут быть другие слова. Или я не правильно понял ваш вариант? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2014, 18:44 |
|
||
|
Помогите составить запрос выбора по нескольким тегам
|
|||
|---|---|---|---|
|
#18+
roman_lenkoЕсли ноутбук — НЕ новинка и НЕ геймерский — то он не подходит. А если этот ноутбук - новинка, но НЕ геймерский? А если это новинка И геймерский, но НЕ ноутбук? Варианты в которых совпадают два критерия из трёх будут идти в списке после тех, где совпадают все три. А варианты с одним совпадающим критерием - ещё позже. Но пользователь всегда получит хоть какие-то предложения даже если он ошибся с одним из критериев. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2014, 19:04 |
|
||
|
Помогите составить запрос выбора по нескольким тегам
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovА если этот ноутбук - новинка, но НЕ геймерский? А если это новинка И геймерский, но НЕ ноутбук? Варианты в которых совпадают два критерия из трёх будут идти в списке после тех, где совпадают все три. А варианты с одним совпадающим критерием - ещё позже. Но пользователь всегда получит хоть какие-то предложения даже если он ошибся с одним из критериев. Ну, если применить эту логику к другим ключевикам, например: "автомобиль", "новинка", "грузовой", то получится, что: > А если этот автомобиль - новинка, но НЕ грузовик? — не катит (т.к., человек хочет именно грузовой автомобиль) > А если это новинка И грузовой, но НЕ автомобиль? — не катит (т.к., грузовым может быть и поезд, и самолёт ...) Я, вроде, понимаю о чём вы, но мне это, к сожалению, не подходит на практике. Я и так уже провёл достаточно логических оптимизаций (на стороне приложения), чтобы добиться точной определённости, что человек хочет именно то, что он запросил. Релевантность у меня тоже организована, но иначе. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2014, 19:11 |
|
||
|
Помогите составить запрос выбора по нескольким тегам
|
|||
|---|---|---|---|
|
#18+
roman_lenkoЯ, вроде, понимаю о чём вы, но мне это, к сожалению, не подходит на практике. Потому что у тебя критериев мало. Попробуй на критериях "Вольво", "зелёный", "2005 год выпуска", "в хорошем состоянии", "хэтчбэк", "дёшево". Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2014, 19:33 |
|
||
|
Помогите составить запрос выбора по нескольким тегам
|
|||
|---|---|---|---|
|
#18+
roman_lenko, 1.Если изменить запрос Dimitry Sibiryakov Код: sql 1. 2. 3. 4. получатся ТОЛЬКО "ноутбуки-новинки для геймеров". 2.У Вас три варианта запросов: 1)вложенные 2) с intersect 3) с group by Как они отличаются по скорости выполнения? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.05.2014, 13:02 |
|
||
|
|

start [/forum/topic.php?fid=32&msg=38640131&tid=1540888]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
148ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
50ms |
get tp. blocked users: |
1ms |
| others: | 14ms |
| total: | 256ms |

| 0 / 0 |

Извините, этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
... ля, ля, ля ...