Я использую Postgresql.У меня есть таблица элементов, таблица тегов и таблица, которая связывает множество тегов с элементом.Мне нужно выбрать элементы, которые соответствуют 2 (или более) заданным тегам.
Я могу выбрать элементы, которые соответствуют 1 или более с WHERE tag.name IN ('tag1', 'tag2')
В MySQL, я думаю, я мог бы сказать WHERE x IN ALL (y, z)
, но это не работает, pgsql, похоже
Пока лучшее, что у меня есть, - это объединить две таблицы дважды, используя подзапрос.Очевидно, что это не будет соответствовать многим тегам, и я уверен, что это не самый эффективный подход.работает лучше, чем моя предыдущая попытка
SELECT item.id, count(tag2) AS relevance
FROM item
JOIN tagged tagged1 ON tagged1.item=item.id
JOIN tag tag1 ON (tag1.id=tagged1.tag AND tag1.name='tag1')
JOIN tagged tagged2 ON tagged2.item=item.id
JOIN tag tag2 ON (tag2.id=tagged2.tag)
WHERE tag2.name IN ('tag2', 'tag3')
GROUP BY item.id
В соответствии с просьбой, вот некоторые определения таблиц для пояснения:
CREATE TABLE item (id serial, [...]);
CREATE TABLE tag (id serial, name string UNIQUE);
CREATE TABLE taged (tag int references tag(id), item int references item(id));