Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Базы Данных > Фильтр новостей по нескольким тегам


Автор: taral 12.12.2010, 03:08
Здравствуйте. Подскажите как лучше реализовать запрос
Есть таблица новости
---news---
id  name
1   новость_1
2   новость_2
3   новость_3

Есть таблица теги
---tags---
id   name
1   тег_1
2   тег_2

Соотношение таблиц много к многому потому есть промежуточная таблица
---news_tags---
tag_id    news_id
1             1
2             1
1             2
2             3

Нужно выбрать все новости у которых есть определенные теги. Допустим тег_1 и тег_2. Я делаю запрос такой
Код

SELEC news.* FROM news JOIN news_tags ON (news_tags.news_id = news.id) WHERE news_tags.tag_id IN (1,2) GROUP BY news.id

Проблема заключается в том что в news_tags 4 миллиона записей, в tags 250 и в news 236000. И запрос такого вида обрабатывается достаточно медленно. Подскажите решение.

Автор: skyboy 12.12.2010, 09:58
Цитата(taral @  12.12.2010,  02:08 Найти цитируемый пост)
Допустим тег_1 и тег_2

твой запрос выбирает новости либо с тегом_1, либо с тегом_2, либо с обоими. не обязательно, чтоб были одновременно оба.
если количество тегов для одновременного поиска ограничено 2, то запрос
Код

SELECT news.*
FROM news_tags nt1
INNER JOIN news_tags nt2
ON nt2.news_id = nt1.news_id
INNER JOIN news
ON news.id = nt2.news_id
WHERE nt1.tag_id = 1 AND nt2.tag_id = 2

Автор: taral 12.12.2010, 14:31
Количество тегов для фильтрации может от 1 до 31. Еще возникла проблема в том что база значительно большая. И я думал может разделить запрос на 2 или придумать еще что то. Тот запрос что привел я (кстати вы верно подметили он работает не так как нужно) обрабатывается 5 секунд что конечно не подходит.

Добавлено через 14 минут и 48 секунд
Сейчас пришел в голову такой запрос но это тоже не выход
Код

SELEC news.*, COUNT(news_tags.*) as count FROM news JOIN news_tags ON (news_tags.news_id = news.id) WHERE news_tags.tag_id IN (1,2) GROUP BY news.id HAVING count=2

В данном случае HAVING count=2 потому что тегов 2. Вот только это уже совсем никакое решение. С таблицей как у меня в 230000 записей этот запрос будет обрабатываться оочень долго

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)