У меня много отношения
table: images
id imageName
1 pic01
2 pic02
3 pic03
table: imagesKeywords
imageId keywordId
1 2
1 3
1 4
2 3
3 1
3 4
3 2
table: keywords
id keywordName
1 car
2 tree
3 cat
4 phone
Каждое изображение имеет несколько ключевых слов, а на разных изображениях может быть одно и то же ключевое слово.
Мне нужно выполнить поиск изображений, у них есть определенное keywordName
.
пример-1: поиск автомобиля и телефона
результат должен быть: pic03
пример-2: поиск дерева и телефона
результат должен быть: pic01, pic03
Кажется, вы хотите, чтобы JOIN
с GROUP BY
:
select i.imageName
from images i inner join
imagesKeywords ik
on ik.imageId = i.id inner join
keywords k
on k.id = ik.keywordId
where k.keywordName in ('car', 'phone')
group by i.imageName
having count(*) = 2;
Одно из возможных решений,
with subquery as
(select i1.imageName, k1.keywordName from keywords k1 join imagekeywords ik1 on k1.id=ik1.keywordId join images i1 on i1.id = ik1.imageId )
select a.imageName from subquery a join subquery b on a.imageName=b.imageName where a.keywordName ='car' and b.keywordName='phone';
Как я понимаю вас, это должно работать:
select i.imageName as name from keywords k
join imagesKeywords iK on k.id = iK.keywordId
join images i on iK.imageId = i.id
group by i.imageName;