Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Фильтр новостей по нескольким тегам 
:(
    Опции темы
taral
Дата 12.12.2010, 03:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 230
Регистрация: 17.1.2008

Репутация: нет
Всего: нет



Здравствуйте. Подскажите как лучше реализовать запрос
Есть таблица новости
---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. И запрос такого вида обрабатывается достаточно медленно. Подскажите решение.

Это сообщение отредактировал(а) taral - 12.12.2010, 03:09
PM MAIL   Вверх
skyboy
Дата 12.12.2010, 09:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 14
Всего: 260



Цитата(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

PM MAIL   Вверх
taral
Дата 12.12.2010, 14:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 230
Регистрация: 17.1.2008

Репутация: нет
Всего: нет



Количество тегов для фильтрации может от 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 записей этот запрос будет обрабатываться оочень долго
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Базы Данных | Следующая тема »


 




[ Время генерации скрипта: 0.0422 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.