MySQL Forums
Forum List  »  Russian

сложная(?) выборка
Posted by: Alexander Dorogikh
Date: February 17, 2010 08:40AM

Есть три таблици Tag, Post, Tag_has_Post
Tag и Post имеют связь MANY_MANY через таблицу Tag_has_Post.

Теперь если нужно выбрать все посты имеющие какойто один тег - то все просто.

Можно ли одним (или двумя запросами) выбрать все посты которые имеют указанные теги???
Скажем есть (напишу упрощенно)
Пост | Теги
1 | 1, 2, 3
2 | 1, 3, 4
3 | 1, 2, 5
4 | 2, 3, 5, 6

Мне нужно выбрать все посты которые имеют теги 2 и 5.
Тоесть получить я должен Посты 3 и 4.
(Это действительно не тривиально или я туплю сегодня).

Я нашел два варианта но они корявые, если их можно упростить то я не вижу как.

1.
SELECT DISTINCT Post_id FROM Tag_has_Post
WHERE Post_id IN (SELECT DISTINCT Post_id from Tag_has_Post WHERE Tag_id=2) AND Tag_id=5

Если тегов много то придется вкладывать подзапрос в запрос снова и т.д.

Верхний предел для количества тегов на пост я оцениваю.... ну скажем в 20 тегов/пост. Тоесть фактически будем иметь 19+1 запросов.

2.
SELECT DISTINCT t1.Post_id FROM Tag_has_Post t1, Tag_has_Post t2 WHERE t1.Tag_id=2 AND t2.Tag_id=5 AND t1.Post_id=t2.Post_id

Такой запрос проще формировать - ну мне так кажется, но он не особо лучше первого.
Ситуация с количеством запросов таже.

Options: ReplyQuote


Subject
Views
Written By
Posted
сложная(?) выборка
11072
February 17, 2010 08:40AM


Sorry, you can't reply to this topic. It has been closed.

Content reproduced on this site is the property of the respective copyright holders. It is not reviewed in advance by Oracle and does not necessarily represent the opinion of Oracle or any other party.