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