выборка по одной колонке с разными значениями

nhb

Новичок
выборка по одной колонке с разными значениями

Есть три таблицы:

content (cid, cname, ...)
хранит информацию о записях

tags (tid, tname, ...)
хранит информацию о метках

tags_links (tid, cid)
хранит информацию о связях меток и записей

Понятно, как получить все записи, имеющие одну метку
Понятно, как получить все записи, имеющие одну или другую метку

А как получить все записи, имеющие ОБЕ метки сразу?

т.е. нужно что-то вроде
"SELECT c.* FROM content AS c, tags_links AS tlinks WHERE c.cid=tlinks.cid AND tlinks.tid = 1 AND tlinks.tid = 2;"

которое по понятным причинам не работает

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

bkonst

.. хочется странного?...
Код:
SELECT c.* 
  FROM content AS c, tags_links AS l1, tags_links AS l2
  WHERE
    l1.cid = c.cid AND 
    l2.cid = c.cid AND
    l1.tid = 1 AND 
    l2.tid = 2;
?
 

nhb

Новичок
да, такой вариант есть
но он как-то слишком топорен.

завтра захочется выбрать записи, имеющие 3, 4, 5, 10 меток, и?.. слишком большой запрос, не говоря уж о том, что его еще надо прачильно сгенерировать в зависимости от количества меток.

хочется чего-то более простого. мне почему-то кажется, что такая задача должна решаться меньшим количеством кода, чем это предполагается сейчас.
 

bkonst

.. хочется странного?...
Нужен отбор именно по значениям меток или по их количеству?
 

nhb

Новичок
по значению, конечно.

стандартная функциональность блога (к примеру) предполагает фильтрацию записей по какой-либо метке (keyword, ключевое слово, тема, etc).

я же хочу фильтровать записи по произвольному количеству меток.

-~{}~ 31.03.06 15:54:

В общем, нашел одно решение, но на мой взгляд - не вполне оптимальное.
Код:
SELECT c.*, COUNT(tlinks.cid) as counter FROM content AS c, tags_links AS tlinks WHERE tlinks.cid = c.cid AND (tlinks.tid = 1 OR tlinks.tid = 2) GROUP BY c.cid
результат просматривается скриптом и оттуда убираются все записи, в которых counter не соответствует количеству меток.

надеюсь, кому-нибудь придет в голову более изящное решение.
 
Сверху