Я работаю с вашей стандартной установкой тэгов таблиц
item_table
item_id
item_name
tag_table
tag_id
tag_name
tag_map
map_id
tag_id
item_id
Как это работает, должно быть очевидно для всех, кто использовал подобную схему для своей архитектуры тегов, теперь, используя эту схему, у меня есть сценарий, в котором мне нужно распечатать результаты item_table, которые соответствуют нескольким тегам, что означает, что они должны каждый тег представлен для сопоставления и печати элемента из таблицы элементов, что-то написанное теоретически, как это
SELECT i.item_id, i.item_name, t.tag_id, t.tag_name, m.tag_id, m.item_id FROM item_table AS i
JOIN tag_table AS t ON t.tag_id = m.tag_id
JOIN tag_map AS m ON m.item_id = i.item_id
WHERE t.tag_name = 'tag_one'
AND t.tag_name = 'tag_two'
И желаемый результат будет что-то вроде
item 1 (поскольку записи для элемента 1 назначили как tag_one, так и tag_two в таблице тегов) пункт 2 (то же самое) (но не элемент 3, поскольку он имеет только tag_one или ни один из тегов)
Конечно, я знаю, что это не сработает, и почему я просто представил неверно сформированный пример, чтобы подчеркнуть, что я пытаюсь выполнить.
Заранее благодарим за любые советы.
попробуйте
SELECT i.item_id, i.item_name, t.tag_id, t.tag_name, m.tag_id, m.item_id
FROM item_table AS i
JOIN tag_map AS m ON m.item_id = i.item_id
JOIN tag_table AS t ON t.tag_id = m.tag_id AND t.tag_name IN('tag1','tag2')
WHERE m.map_id NOT IN (SELECT m1.map_id FROM tag_map m1,item_table i1, tag_table t1
WHERE m1.item_id = i1.item_id AND m1.tag_id = t1.tag_id AND t1.tag_name IN('tag1','tag2')
GROUP BY m1.item_id HAVING COUNT(m1.item_id) <2)