База слов содержит поля id и word (например Оптимизация,сайт,контент,привет итп)
База переходных индексов содержит id слова и id странички
например
Слова:
id words
1-Оптимизация
2-Сайт
Связи:
id pid
1 1
2 1
Странички:
id url и так далее..
1 page
Как выбрать все странички у которых пересечения pid по заданному id слова?
Пока что разрешил это так:
Делаем два запроса
select url,title,content from index_pages ip,index_words iw,index_id inid where iw.word="Оптимизация" and iw.id=inid.uid and inid.pid=ip.id
select url,title,content from index_pages ip,index_words iw,index_id inid where iw.word="сайт" and iw.id=inid.uid and inid.pid=ip.id
результаты пишем в массивы и потом array_intersectом находим пересечения
Наверняка это можно сделать более лаконично и с меньшими затратами памяти и скорости :\
p.s. прошу модератора перенести топик в раздел Базы данных
Спустя 2 часа, 43 минуты, 2 секунды (1.07.2008 - 14:45) sergeiss написал(а):
Вот так можно попробовать...
Для краткости я обозначу твои селекты как SELECT1 и SELECT2, подразумевая их полный синтаксис.
Будет использовать эти два селекта в другом селекте:
---
SELECT s1.url, s1.title,s1.content
FROM
( SELECT1 ) as s1, ( SELECT2 ) as s2
where s1.url=s2.url and s1.title=s2.title and s1.content=s2.content
---
Для краткости я обозначу твои селекты как SELECT1 и SELECT2, подразумевая их полный синтаксис.
Будет использовать эти два селекта в другом селекте:
---
SELECT s1.url, s1.title,s1.content
FROM
( SELECT1 ) as s1, ( SELECT2 ) as s2
where s1.url=s2.url and s1.title=s2.title and s1.content=s2.content
---
Спустя 46 минут, 9 секунд (1.07.2008 - 15:31) NeverMore написал(а):
Спасибо всё заработало) Экономия памяти почти в три раза и + в скорости
Спустя 10 минут, 31 секунда (1.07.2008 - 15:42) Alchemist написал(а):
Код
SELECT `index_pages`.*
FROM `index_pages` INNER JOIN `index_id` ON `index_pages`.`id` = `index_id`.`pid`
INNER JOIN `index_words` ON `index_words`.`id` = `index_id`.`uid`
WHERE `index_words`.`word` = "Оптимизация" OR `index_words`.`word` = "сайт"
GROUP BY `index_pages`.`id`
HAVING COUNT(`index_words`.`id`) >= 2
FROM `index_pages` INNER JOIN `index_id` ON `index_pages`.`id` = `index_id`.`pid`
INNER JOIN `index_words` ON `index_words`.`id` = `index_id`.`uid`
WHERE `index_words`.`word` = "Оптимизация" OR `index_words`.`word` = "сайт"
GROUP BY `index_pages`.`id`
HAVING COUNT(`index_words`.`id`) >= 2
_____________