Хранение тегов объекта и выборки по ним

artman

Новичок
Хранение тегов объекта и выборки по ним

Здравствуйте.

Есть объекты. Есть тэги объектов нескольких типов.

Хранятся в виде:

table_obj (id,...) - таблица объектов
table_tag (id, type, name) - таблица тегов
table_obj_tag (id, obj_id, tag_id) - таблица тегов объектов

Что то не могу сообразить как сделать следующие вещи наиболее простым и оптимальным образом:

1. Выбрать все объекты обладающие несколькими конкретными тегами.
2. Выбрать все объекты обладающими тегами только определеного типа и при этом не обладающие тегами других типов.

В голову лезут какие то сложные вещи, типа временных таблиц и т.п. Но понимаю, что можно сделать проще.

Может я изначально неправильно храню данные?

Заранее, Большое Спасибо, всем откликнувшимся!
 

prolis

Новичок
[sql]
select * from table_obj tob, table_obj_tag tot, table_tag tt
where tob.id=tot.obj_id and tt.id=tot.tag_id
[/sql]
ну а дальше свои условия в where, в этом запросе доступны все поля
 

artman

Новичок
Да при этой связи можно найти объект обладающий конкретным тегом например:

WHERE tot.tag_id=5

А Если нужно чтобы объект обладал еще тегом tag_id=7?

AND - даст null
OR - найдет те которые могут обладать только одним тегом.
 

prolis

Новичок
пардон,
[sql]
SELECT tot.id
FROM table_obj tob, table_obj_tag tot, table_tag tt
WHERE tob.id = tot.obj_id AND tt.id = tot.tag_id
and tot.tag_id in (5,7)
group by tot.id
having count(*)=2
[/sql]
 

artman

Новичок
То есть это вариант оптимален - HAVING не будет замедлять скрипт?

Этот вариант симпотичен. )

А как быть со вторым вопросом. Пока я понимаю что данные все таки в нужном виде хранятся...
 

iceman

говнокодер
>То есть это вариант оптимален - HAVING не будет замедлять скрипт?

подрастешь, узнаешь, оптимизируешь!

>2. Выбрать все объекты обладающими тегами только определеного типа и при этом не обладающие тегами других типов.

разбей на простые задачи, реши их и потом склей...
 

artman

Новичок
Автор оригинала: iceman
>2. Выбрать все объекты обладающими тегами только определеного типа и при этом не обладающие тегами других типов.
разбей на простые задачи, реши их и потом склей...
Это понятно. Я думал можно сделать как нибудь красиво лаконично.
 

iceman

говнокодер
это и будет красиво и лаконично одним запросом.
 

zerkms

TDD infected
Команда форума
можно красиво и лаконично сделать 2 джоина.
 
Сверху