首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL:和/或与多到多连接匹配。

SQL:和/或与多到多连接匹配。
EN

Stack Overflow用户
提问于 2012-11-25 17:22:52
回答 2查看 172关注 0票数 2

我是一个SQL新手,试图理解如何做一个稍微复杂的查询。在Rails 3应用程序中工作,我有一个多到多的关系之间的照片和术语.这个设置非常普通:

代码语言:javascript
复制
photos: id

terms: id

photos_terms: photo_id | term_id

我想要做的是在任意一组术语中找到和或匹配。例如,在伪SQL中:

代码语言:javascript
复制
Select Photos where Term ID in (1 or 2) and (3 or 4 or 5) and (6).

你怎么能写这样的查询呢?作为参考,我正在使用PostgreSQL。

为了响应Rubens的回答,这里有一些可能有助于解释分组的信息,尽管我不确定它以前是否相关:

还有另一个模型,分类法,所以是taxonomies表。每个术语都属于分类法,分类法可以是包容性的(这意味着可以应用来自该分类法的多个术语),也可以是排他性的(该分类法中的术语是相互排斥的,只有一个可以应用)。

表的关系是这样的:

代码语言:javascript
复制
terms: id | taxonomy_id

taxonomy: id | inclusive(boolean)

分组将是来自不同分类的术语,您总是希望每个分组都有一个和匹配的。您想要包含分类法的术语之间的匹配,以及来自独占分类法的术语之间的OR匹配。

要给出另一个伪代码示例,如果我们有以下内容:

代码语言:javascript
复制
Taxonomy: Color (inclusive = true)
Terms: Red, Blue, Green

Taxonomy: Location (inclusive = false)
Terms: NY, NJ, PA, MD

我可能需要这样的查询:

代码语言:javascript
复制
Photos where terms in (red and blue) and (NY or NJ).

这有意义吗?这些术语就像高度结构化的标签。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-11-25 17:48:26

代码语言:javascript
复制
SELECT * FROM photos p
WHERE 1=1
AND EXISTS ( SELECT * FROM photos_term pt
    WHERE pt.photo_id = p.id AND term_id IN (1,2)
    )
AND EXISTS ( SELECT * FROM photos_term pt
    WHERE pt.photo_id = p.id AND term_id IN (3,4,5)
    )
AND EXISTS ( SELECT * FROM photos_term pt
    WHERE pt.photo_id = p.id AND term_id IN (6)
    )
    ;
票数 2
EN

Stack Overflow用户

发布于 2012-11-25 17:33:01

你可能想要的东西

代码语言:javascript
复制
SELECT photo_id FROM photos JOIN photos_terms ON (photos.id = photo_id)
WHERE term_id IN (1,2,3,4,5,6)
GROUP BY photo_id
HAVING
 bool_or(term_id IN (1,2))
 AND bool_or(term_id IN (3,4,5))
 AND bool_or(term_id = 6)

(条件是可选的,但可能会加快速度)。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13553450

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档