SQL:选择* where属性匹配数组中的所有项

时间:2011-04-29 22:16:02

标签: sql arrays select

在Rails应用程序中工作,我有以下表格结构(仅限相关列)

照片(id:整数) 标签(photo_id:整数,tag_id:整数) 标签(id:整数,名称:字符串)

我有以下SQL查询:

SELECT distinct photos.* 
FROM \"photos\" INNER JOIN \"taggings\" ON \"photos\".\"id\" = \"taggings\".\"photo_id\" 
                INNER JOIN \"tags\"     ON \"tags\".\"id\" = \"taggings\".\"tag_id\" 
WHERE \"tags\".\"name\" IN ('foo', 'bar')

当我生成此查询时,我传入了一个标记数组(在本例中为["foo","bar"])。查询正确搜索与数组中传递的任何标记匹配的照片。

如何更改此查询以选择包含所有给定标记的记录(即,如果照片仅标记为“foo”和“bar”,则不会选择带有任何给定标记的记录?

2 个答案:

答案 0 :(得分:2)

可能有更好的方法,但这应该做到

SELECT photos.id,max(otherColumn)
FROM \"photos\" 
INNER JOIN \"taggings\"
ON \"photos\".\"id\" = \"taggings\".\"photo_id\" 
INNER JOIN \"tags\" 
ON \"tags\".\"id\" = \"taggings\".\"tag_id\" 
WHERE \"tags\".\"name\" IN ('foo', 'bar')
group by photos.id
having count(*) = 2 --2 is the number of items in your array of tags.

答案 1 :(得分:0)

如果你在rails中,则不需要查询来执行此操作。

Tags.find(1).taggings会为您提供包含该标记的所有照片数组

you can also use Tags.find_by_name("foo").taggings

你可以类似地迭代所有标签,然后收集数组,然后就像你所拥有的数组一样。

[ 1, 1, 3, 5 ] & [ 1, 2, 3 ]   #=> [ 1, 3 ]

基本上'和'数组并获得独特的照片。这样你就可以获得与所有标签相匹配的照片。