sql - 在我的 sql 查询中使用相交运算符的替代方法

标签 sql postgresql many-to-many intersection

我有 2 个表,它们之间有很多基数。所以通过规范化,我创建了这个:

   User
   UserId  UserName ....
     1       a
     2       b

  UserObject
  UserId  ObjectId
     1        1
     1        2
     2        2

  Object
  ObjectId  ObjectName
     1        c
     2        d

现在我想运行一个查询来了解拥有特定对象的用户。

例如:同时拥有对象c和d的所有用户。

一种方法

   Select userid from UserObject where objectid=1 intersect Select userid from UserObject where objectid= 2

根据我的用例,我可能需要搜索具有 2-7 个对象组合的用户。写这么多交集会不谨慎。

我正在研究 postgesql 9.1。

实现这一目标的其他有效方法是什么?

最佳答案

SELECT uo.UserId
    FROM UserObject uo
    WHERE uo.ObjectId IN (1,2)
    GROUP BY uo.UserId
    HAVING COUNT(DISTINCT uo.ObjectId) = 2

将这个概念扩展到 7 个对象:

SELECT uo.UserId
    FROM UserObject uo
    WHERE uo.ObjectId IN (1,2,3,4,5,6,7)
    GROUP BY uo.UserId
    HAVING COUNT(DISTINCT uo.ObjectId) = 7

关于sql - 在我的 sql 查询中使用相交运算符的替代方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7612154/

相关文章:

many-to-many - 如何在redis中建立多对多关系

mysql - 当 'IN' 条件的所有值都没有结果时,SQL 选择默认值

sql - 执行SQL中只存在一个

sql - 如何使用连接优化 postgresql 查询?

django - 如何为谷歌表单等字段设计数据库?

mysql - Sequelize MySQL 处理查询中的 native 引用错误(ManyToMany)

sql - 为 10k+ 用户保存用户数据的最佳方法

php - 如何构建一个将返回标志的 MySQL 查询,根据另一个表中的行返回 y 或 n?

postgresql - 从函数返回记录

php - Doctrine setter 在多对多关系上有什么用?