SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 07.02.2009 20:41:50

Ilim
Участник
Зарегистрирован: 07.02.2009
Сообщений: 6

Помогите с запросом плз.

Вопрос в следующем:

Есть таблица с короткими статьями, к примеру:
stat: id, text
        1, статья1
        2, статья2
        ...

Из всех статей выделяется список ключевых слов и заносится в таблицу:
words: id, word
           1, слово1
           2, слово2
           3, слово3
           ...

В таблицу 
main: stat, word заносится соответствие ключевых слов статьям, т.е. в каких статьях какие слова есть:
             1, 1
             1, 2
             2, 3

Нужно организовать поиск статей по нескольким словам (от 1 и до...), чтоб выводились только статьи, где есть все слова.
Теоретически понимаю, что нужно по списку слов получить из таблицы words id этих слов.
Из таблицы main получить те значения stat, у которых есть в паре, в word, id  всех слов.
Ну и потом выводить те статьи из stat, id которых равны  значениям stat, полученным из main.
Но вот на практике пока что-то не получается... sad

Каким способом проще всего это реализовать? Одним запросом или несколькими?
Нужна максимальная производительность запроса, так как в main может быть несколько миллионов записей.  Да и в двух других таблицах - тоже не мало.

Отредактированно Ilim (07.02.2009 20:43:37)

Неактивен

 

#2 08.02.2009 00:00:32

Proger
Активист
Откуда: Санкт-Петербург
Зарегистрирован: 04.09.2008
Сообщений: 172

Re: Помогите с запросом плз.

Я представляю это в простых запросах. С кешированием результатов либо средствами mysql либо ещё и своими силами. Делать JOIN я думаю не имеет смысла. Потому попробуйте как вы и написалы словами только в sql постепенно запрос за запросом. Удачи!

Неактивен

 

#3 08.02.2009 00:56:44

Ilim
Участник
Зарегистрирован: 07.02.2009
Сообщений: 6

Re: Помогите с запросом плз.

Ок. Буду пробовать... Пасиб!

Неактивен

 

#4 09.02.2009 10:42:12

Ilim
Участник
Зарегистрирован: 07.02.2009
Сообщений: 6

Re: Помогите с запросом плз.

Решил вопрос так:

1. Получаю из word id всех слов.
2. Автоматом составляю запрос. Для 3 слов, к примеру получается так:

SELECT *
FROM stat
WHERE id
IN (

SELECT DISTINCT t1.stat
FROM main t1
WHERE t1.word =264
AND t1.stat
IN (

SELECT t2.stat
FROM main t2
WHERE t2.word =5679
AND t2.stat
IN (

SELECT t3.stat
FROM main t3
WHERE t3.word =567
)
)
)
LIMIT 0 , 10

Вроде работает намана smile
Что скажите?

Отредактированно Ilim (09.02.2009 10:42:44)

Неактивен

 

#5 09.02.2009 18:53:25

Proger
Активист
Откуда: Санкт-Петербург
Зарегистрирован: 04.09.2008
Сообщений: 172

Re: Помогите с запросом плз.

Смотрите на то чтобы в slow-query log не упал запросец wink Да и наверное если данные меняются реже чем просматривуются, имеет смысл кеш замутить в отдельной табличке. Правда это уже вопрос и времени исполнения запроса (в среднем) и количеству (в КБ) возвращаемой информации.

Неактивен

 

#6 09.02.2009 21:47:36

Ilim
Участник
Зарегистрирован: 07.02.2009
Сообщений: 6

Re: Помогите с запросом плз.

Работает вроде шустро.
К тому-же запросы будут, думаю, 1-2 слова, в основном. 3 и больше - редко.

Неактивен

 

#7 10.02.2009 16:00:40

Proger
Активист
Откуда: Санкт-Петербург
Зарегистрирован: 04.09.2008
Сообщений: 172

Re: Помогите с запросом плз.

Тогда наверное покажет время. если работает шустро то хорошо, но надо наверное иногда мониторить wink

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson