使用 MySQL,是否有一种有效的方法通过检查关联表上是否存在多行来过滤一个表上的记录?
例如,我有一个图像表格和另一个标识该图像中的对象的表格:
table: images
id | url
----+--------------------------------
1 | http://www.example.com/foo.png
2 | http://www.example.com/bar.png
3 | http://www.example.com/baz.png
table: image_tags
image_id | tag
----------+-------------
1 | cats
1 | living-room
2 | beach
2 | towel
2 | dogs
3 | cats
3 | dogs
3 | goldfish
如果我想查询包含猫
和狗
的所有图像,最好的方法是什么?如果我想要带有猫
、狗
和金鱼
的图像怎么办?
我尝试过的一种方法是查询包含狗的图像的所有image_ids
,然后查询包含猫的图像,并取交集。我可以在我的应用程序中执行此操作,但我想知道是否有一种方法可以使用 SQL 处理任意数量的标签来运行相同的操作。
最佳答案
我喜欢使用 group by
和 having
来处理这些类型的查询(“set-within-set”查询):
select it.image_id
from image_tags it
where it.tag in ('cats', 'dogs')
group by it.image_id
having count(*) = 2;
请注意,“2”需要等于您想要在 in
列表中匹配的标签数量。
关于MySQL 对关联表上的多行进行过滤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32127152/