с учетом определения таблицы:
Objects:
obj_id | obj_name
-------|--------------
1 | object1
2 | object2
3 | object3
Tags:
tag_id | tag_name
-------|--------------
1 | code:python
2 | code:cpp
3 | color:green
4 | colorful
5 | image
objects_tags:
obj_id | tag_id
-------|---------
1 | 1
1 | 2
2 | 1
2 | 3
3 | 1
3 | 2
3 | 3
Я бы хотел выбрать объекты, которые содержат все теги из данного списка с подстановочными знаками .Подобный вопрос задавался несколько раз, и ответ на более простой вариант выглядит примерно так:
SELECT obj_id,count(*) c FROM objects_tags
INNER JOIN objects USING(obj_id)
INNER JOIN tags USING(tag_id)
WHERE (name GLOB 'code*' OR name GLOB 'color*')
GROUP BY obj_id
HAVING (c==2)
Однако это решение не работает с подстановочными знаками.Можно ли создать аналогичный запрос, который бы возвращал объекты, которые для каждого данного подстановочного запроса возвращали хотя бы 1 тег?Проверка, не работает ли c>=2
, потому что один подстановочный тег может возвращать несколько результатов, в то время как другой может возвращать 0, все еще передавая запрос, даже если это не должно.из N INTERSECT
s (по одному на тег), потому что их, вероятно, не будет много, но это звучит как очень грязное решение, и если есть еще какой-то способ SQL, я бы предпочел использовать его.