SQL многие ко многим выбирают с помощью таблицы ссылок

Я пытаюсь сделать поиск по ключевым словам максимально эффективным, используя следующие 3 таблицы:

tblImageFiles[ID, ImageURL]

tblTags[ID, тег]

tblxImagesTags[ID, ImageID, TagID] (это ссылка, соединяющая вышеперечисленное в отношениях "многие ко многим")

Может ли кто-нибудь помочь мне с хранимой процедурой вернуть ВСЕ изображения, которые соответствуют ВСЕМ тегам поиска, введенным на основе этой схемы?

Спасибо

2 ответа

Решение

Число в count(distinct aux.TagID) должно быть равно количеству тегов в where t.Tag in (tag1, tag2, tag3),

select img.* from tblImageFiles img
inner join (
   select it.ImageID from tblTags t
   inner join tblxImagesTags it on it.TagID = t.ID
   where t.Tag in (tag1, tag2, tag3)
   group by it.ImageID
   having count(distinct it.TagID) = 3
) aux on aux.ImageID = img.ID
        SELECT tblImageFiles.ImageURL
          FROM tblImageFiles
  WHERE EXISTS (SELECT 1
                  FROM tblxImagesTags
            INNER JOIN tblTags
                    ON tblTags.ID = tblxImagesTags.TagID
                 WHERE tblxImagesTags.ImgageID = tblImageFiles.ID
                   AND tblTags.Tag = <searchtag1>)
    AND EXISTS (SELECT 1
                  FROM tblxImagesTags
            INNER JOIN tblTags
                    ON tblTags.ID = tblxImagesTags.TagID
                 WHERE tblxImagesTags.ImgageID = tblImageFiles.ID
                   AND tblTags.Tag = <searchtag2>)
                // etc...

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

Другие вопросы по тегам