MySQL 对关联表上的多行进行过滤

标签 mysql sql

使用 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 byhaving 来处理这些类型的查询(“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/

相关文章:

java - 从 java 创建 SQL 函数会导致异常

php - MySQL Min value query group by second column not getting the proper value of third column

mysql - 查询 boolean 错误

.net - 在 Sql server 2005 中过滤 unicode 列 - 多数据匹配

mysql - 如何找到只有男性顾客的商店?

mysql - 存储在数据库中的地址应该规范化吗?

php - 我从 MySQL 数据库中提取数据时出现奇怪的字符

MySQL进程检查器

sql - DB2:多个表之间的外键约束

mysql - 如何连接两个sql子查询