Xpoint
   [напомнить пароль]

Помогите с запросом: many-to-many

Метки: [без меток]
[арх]
2006-02-12 21:21:37 [обр] intenter[досье]

Добрый день. Заранее прошу прощения, если мой вопрос покажется глупым или неуместным.

Имеется таблица TAGS (ID,..) и таблица FEEDS (ID,..). Они имеют между собой отношение many-to-many и связаны таблицой TAGS_FEEDS (TAG_ID, FEED_ID).

Дан набор TAG'ов (id1, id2...). Необходимо:

  1. Получить список FEED'ов, которые имеют связь со всеми данными TAG'ами (они могут быть связаны и с другими, но с данными - обязательно).
  1. Получить список тегов, которые встречаются с данными, попутно посчитав количество FEED'ов.

Чувствую, что решение не очень сложное, но никак не могу додуматься. В принципе, если расскажите как сделать п.1, то п.2 я сам напишу.

Заранее спасибо.

спустя 11 часов [обр] Денис Гетман(5/228)[досье]

 А что за СУБД? По-простому,

SELECT DISTINCT(FEED.ID) 
FROM TAGS_FEEDS LEFT JOIN FEEDS ON (FEED_ID = FEED.ID) 
WHERE TAG_ID IN (id1, id2..);

 Можно даже таблицу FEED не трогать, на у вас-то запрос сложнее будет.
 А что за п.2, я не понял.

спустя 27 минут [обр] intenter[досье]
Денис Гетман[досье], с "IN" не пойдет. Ведь надо список FEED'ов, которые связаны со всеми данными тегами. Никак не могу сформулировать ограничение на группу.
Возможно, здесь как-то нужно воспользоваться COUNT...
спустя 1 час 41 минуту [обр] GRAy(8/259)[досье]
intenter[досье] Вам дали правильное решение для вопроса №1, или ваши объяснения были неправильно поняты ;) Что вы хотите посчитать и сгруппировать?
спустя 3 минуты [обр] intenter[досье]
Решение найдено. Вопрос снимается. Всем спасибо за участие.
спустя 2 минуты [обр] Кирилл [Kirk] Королев(88/673)[досье]
select a.feed_id from feeds a
inner join tags_feeds b on a.feed_id=b.feed_id
inner join tags c on b.tag_id=c.tag_id
where c.tag_id in (...)
group by a.feed_id
having count(c.tag_id)<=@id_cnt
То есть: найти все тэги, соответствующие фидам, с лежащими в определенном интервале ИД, с количеством совпадений не меньшим, чем количество значений в условии.
спустя 5 минут [обр] intenter[досье]

Кирилл [Kirk] Королев[досье], да все именно так как вы написали. Вот только знак перевернуть надо.

Пойду думать над вторым. В принципе, можно сделать JOIN с результатом первого, и плясать от этого, но я думаю, что теперь смогу придумать более оптимальный вариант.

Powered by POEM™ Engine Copyright © 2002-2005