Поиск по нескольким тегам в схеме ассоциативных таблиц

0

Я работаю с вашей стандартной установкой тэгов таблиц

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 или ни один из тегов)

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

Заранее благодарим за любые советы.

  • 0
    это должно быть ИЛИ в случае t.tag_name. Это не может иметь оба права.
  • 0
    Вы неверно истолковываете то, что я пытаюсь выполнить, я знаю, что они не могут иметь оба права прямо при текущей настройке, поэтому я спрашиваю, как бы я проверил таблицу карт для item_id, только если есть строки для каждого tag_ids в заявлении также в таблице. - даже если это означает, что мне нужно переделать схему таблицы, чтобы поддержать это
Показать ещё 1 комментарий
Теги:
tags

1 ответ

0
Лучший ответ

попробуйте

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)
  • 0
    Это работает точно так, как задумано, и, если я это понимаю, это действительно невероятно полезное понимание того, как это должно было быть сделано, большое спасибо!
  • 0
    Я не проверял этот код, но я думаю, что AND после второго JOIN и до WHERE не является правильным. Вы согласны?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню