我是一个SQL新手,试图理解如何做一个稍微复杂的查询。在Rails 3应用程序中工作,我有一个多到多的关系之间的照片和术语.这个设置非常普通:
photos: id
terms: id
photos_terms: photo_id | term_id我想要做的是在任意一组术语中找到和或匹配。例如,在伪SQL中:
Select Photos where Term ID in (1 or 2) and (3 or 4 or 5) and (6).你怎么能写这样的查询呢?作为参考,我正在使用PostgreSQL。
为了响应Rubens的回答,这里有一些可能有助于解释分组的信息,尽管我不确定它以前是否相关:
还有另一个模型,分类法,所以是taxonomies表。每个术语都属于分类法,分类法可以是包容性的(这意味着可以应用来自该分类法的多个术语),也可以是排他性的(该分类法中的术语是相互排斥的,只有一个可以应用)。
表的关系是这样的:
terms: id | taxonomy_id
taxonomy: id | inclusive(boolean)分组将是来自不同分类的术语,您总是希望每个分组都有一个和匹配的。您想要包含分类法的术语之间的匹配,以及来自独占分类法的术语之间的OR匹配。
要给出另一个伪代码示例,如果我们有以下内容:
Taxonomy: Color (inclusive = true)
Terms: Red, Blue, Green
Taxonomy: Location (inclusive = false)
Terms: NY, NJ, PA, MD我可能需要这样的查询:
Photos where terms in (red and blue) and (NY or NJ).这有意义吗?这些术语就像高度结构化的标签。
发布于 2012-11-25 17:48:26
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)
)
;发布于 2012-11-25 17:33:01
你可能想要的东西
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)(条件是可选的,但可能会加快速度)。
https://stackoverflow.com/questions/13553450
复制相似问题