Новости
Документация
Download
Webboard
Поиск
FAQ/ЧаВо
Обратная связь




MySQL.RU - Webboard



Вернуться
Поиск (Den) 01/11/2001 - 20:34:42
      Re: Поиск (Al'Thor) 02/11/2001 - 00:42:41
      Re: Поиск (dannis) 02/11/2001 - 08:33:48
      Re: Нет (Василий) 02/11/2001 - 12:44:29
      Re: Нет (Al'Thor) 02/11/2001 - 13:55:56
      Re: Нет (dannis) 02/11/2001 - 15:25:50
      Re: to dannis - тоже нет (Василий) 02/11/2001 - 16:03:18
      Re: to dannis - тоже нет (dannis) 02/11/2001 - 16:19:15
      Re: Хм (Василий) 02/11/2001 - 16:40:46
      Re: И кстати, Al'Thor (Василий) 02/11/2001 - 17:03:14
      Re: И кстати, Al'Thor (Al'Thor) 02/11/2001 - 17:59:54
      Re: Хм (dannis) 02/11/2001 - 18:35:04
      Re: Изящность (Al'Thor) 02/11/2001 - 19:26:39

> Original message text:
> From: Den - 01/11/2001 - 20:34:42
> Subject:Поиск
> -----------------
> Вопрос такой:
> Есть таблица - справочник слов word вида id_word, word
> есть таблица соответствий Search вида id_page, id_word
>
> Пользователь вводит слова в строке поиска, а надо выдать только
> те страницы (т.е. id_page) в которых ни одно из слов не встречается.
> Слов может быть и одно и десять. Таблицы связываются между собой
> по полю id_word.
>


From: Al'Thor - 02/11/2001 - 13:55:56
Subject:Нет
-----------------
Для оптимизации по скорости можно предложить такую штуку...
Расширить таблицу Search следующим обюразом:

id_page
id_word
num_words

Т.е. добавить поле с количеством слов, которое связано с этой страницей. Тогда, предварительно исключив все повторения в словах - чтобы два раза одно и то же не встречалось в запросе пользователя формируем следующий SQL-запрос:

SELECT id_page FROM Search NATURAL JOIN word WHERE word != Word1 ... AND word != WordN GROUP BY id_page HAVING count(word) = num_words;

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

SELECT num_words FROM Search WHERE id_page = n LIMIT 1;
NewNum = num_words + 1;
UPDATE Search SET num_words = NewNum WHERE id_page = n
INSERT INTO Search(id_page, id_word, num_words) VALUES (n, w, NewNum)

Где n - id страницы, w - id слова

При добавлении новых ключевых слов.

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

Как альтернативу можно конечно предложить вынести num_words в отдельную таблицу, но это замедлит выполнение и может даже увеличить требуемую память.


И конечно же можно делать это всё с помощью временных таблиц.

P.S. Надо же было так лажанутся :-)))
P.P.S. Спасибо Dennis'у за синтаксис NATURAL JOIN. Всё время забываю эти JOIN'ы, приходится из-за этого в два раза больше писать :-)))




[Это сообщение - спам!]

Последние сообщения из форума

Уважаемые посетители форума MySQL.RU!
Убедительная просьба, прежде чем задавать свой вопрос в этом форуме, обратите внимание на разделы:
- ответы на наиболее часто задаваемые вопросы - FAQ
- раздел документация
- раздел поиск по сообщениям форума и документации
Также, старайтесь наиболее подробно указывать свою ситуацию (версию операционной системы, версию MySQL, версию программного обеспечения, по которому возникает вопрос, текст возникающих ошибок, и др.)
Помните, чем конкретнее Вы опишете ситуацию, тем больше шансов получить реальную помощь.
 Имя:
 E-mail:
 Тема:
 Текст:
Код подтверждения отправки: Code
615



РЕКЛАМА НА САЙТЕ
  Создание сайтов | |