Задавайте вопросы, мы ответим
Вы не зашли.
Вопрос в следующем:
Есть таблица с короткими статьями, к примеру:
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.
Но вот на практике пока что-то не получается...
Каким способом проще всего это реализовать? Одним запросом или несколькими?
Нужна максимальная производительность запроса, так как в main может быть несколько миллионов записей. Да и в двух других таблицах - тоже не мало.
Отредактированно Ilim (07.02.2009 20:43:37)
Неактивен
Я представляю это в простых запросах. С кешированием результатов либо средствами mysql либо ещё и своими силами. Делать JOIN я думаю не имеет смысла. Потому попробуйте как вы и написалы словами только в sql постепенно запрос за запросом. Удачи!
Неактивен
Ок. Буду пробовать... Пасиб!
Неактивен
Решил вопрос так:
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
Вроде работает намана
Что скажите?
Отредактированно Ilim (09.02.2009 10:42:44)
Неактивен
Смотрите на то чтобы в slow-query log не упал запросец Да и наверное если данные меняются реже чем просматривуются, имеет смысл кеш замутить в отдельной табличке. Правда это уже вопрос и времени исполнения запроса (в среднем) и количеству (в КБ) возвращаемой информации.
Неактивен
Работает вроде шустро.
К тому-же запросы будут, думаю, 1-2 слова, в основном. 3 и больше - редко.
Неактивен
Тогда наверное покажет время. если работает шустро то хорошо, но надо наверное иногда мониторить
Неактивен