在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”,则不会选择带有任何给定标记的记录?
答案 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 ]
基本上'和'数组并获得独特的照片。这样你就可以获得与所有标签相匹配的照片。