【发布时间】:2018-06-02 20:19:57
【问题描述】:
给定一个表定义:
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 个 INTERSECTs(每个标签一个)组成,因为它们可能不会很多,但听起来确实很脏,如果还有更多 SQL 方式那我宁愿用它。
【问题讨论】:
标签: sql sqlite select tags entity-relationship