【问题标题】:SQL select users that belong to the same objectSQL 选择属于同一对象的用户
【发布时间】:2015-09-07 05:08:50
【问题描述】:

我设置了一个 MySQL 数据库,其中有一个 User、Project 和 ProjectUser 表。 ProjectUser 表具有 UserID 和 ProjectID 并将用户映射到项目。我希望能够查询两个不同用户的共同项目。因此,如果 Bob 属于项目 A、B、C、D,而 Joe 属于项目 C、D、E、F...,那么当我知道 Bob 和 Joe 的 UserID 时,我想选择项目 C 和 D 的信息。

【问题讨论】:

    标签: mysql sql database select


    【解决方案1】:

    假设这是您提供的元数据和示例。

    create table User        (UserID    int, Name varchar(200));
    create table Project     (ProjectID int, Name varchar(200), Information varchar(200));
    create table ProjectUser (UserID    int, ProjectID int    );
    
    INSERT INTO User        VALUE (1,'Bob'),(2,'Joe');
    INSERT INTO Project     VALUE (1,'A','First'),(2,'B','Second'),(3,'C','Third'),(4,'D','Fourth'),(5,'E','Fifth'),(6,'F','Sixth');
    INSERT INTO ProjectUser VALUE (1,1),(1,2),(1,3),(1,4),(2,3),(2,4),(2,5),(2,6);
    

    假设 ProjectUser 表中的记录对于 UserIDProjectID 是唯一的,您可以通过以下方式获取 Bob 和 Joe 共享的项目的详细信息:

    SELECT Project.* FROM Project WHERE Project.ProjectID IN
    (
       SELECT Project.ProjectID 
    
       FROM ProjectUser 
    
       INNER JOIN User
       ON User.UserID       = ProjectUser.UserID
    
       INNER JOIN Project
       ON Project.ProjectID = ProjectUser.ProjectID
    
       WHERE User.Name IN ('Bob','Joe')
    
       GROUP BY Project.ProjectID 
    
       HAVING COUNT(*) > 1
    )
    

    试试http://sqlfiddle.com/

    【讨论】:

      【解决方案2】:

      您可以分别为 userId1 和 userId2 选择项目,最后通过相交您会发现有这两个用户的项目!!! 对于 SQL 服务器

      select * from projects where PID IN
      (select PID from ProjectUser PU1 where UserId = UserID1 
      INTERSECT 
      select PID from ProjectUser PU2 where UserId = UserID2)
      

      对于mySql,你写如下:

      select * from projects where PID IN
          (select PID from ProjectUser PU1 where UserId = UserID1 and  
                  PID In (select PID from ProjectUser PU2 where UserId = UserID2))
      

      【讨论】:

      • 这可行,但我使用的是 MySQL 数据库,它不支持 INTERSECT。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-02
      • 1970-01-01
      • 2012-12-22
      • 2017-09-14
      • 2023-04-08
      相关资源
      最近更新 更多