2015-12-15 70 views
-1

我有这个表的多对多的关系SQL查询来过滤多对多关系

USER 
----- 
Id 


CASE 
---- 
Id 
Created 

Users_Cases 
------------ 
UserId 
CaseId 

你能帮我找出SQL查询来获取谁的情况下,在某个日期之前创建的用户( 2015年10月14日)?谢谢,

编辑:如果用户有2例,第一种情况是日期和日期后,在另一个之前创建的使用不应该被包括在结果

User 
User1 
User2 
User3 

Case 
Case1 - 9/14/2015 
Case2 - 11/14/2015 
Case3 - 12/14/2015 
Case4 - 8/15/2015 

Users_Cases 
User1 - Case1 
User1 - Case2 
User2 - Case3 
User3 - Case4 

预期的结果:只有用户3。用户1的日期为<,但还有另一种情况> =日期,因此user1未包含在结果中。

回答

1
SELECT * 
FROM "user" u 
INNER JOIN "Users_Cases" uc ON u.id = uc.UserId 
INNER JOIN "CASE" c ON uc.CaseId = c.id WHERE c.Created < '10/14/2015' 

OR

SELECT * 
FROM "user" 
WHERE id IN (
     SELECT UserId 
     FROM "Users_Cases" uc 
     INNER JOIN "CASE" c ON uc.CaseId = c.id WHERE c.Created < '10/14/2015') 
     ) 

编辑:由于每个操作的评论

SELECT * 
FROM "user" 
WHERE id IN (
     SELECT uc.UserId 
     FROM "case" c 
     INNER JOIN "Users_Cases" uc ON uc.CaseId = c.id 
     WHERE c.Created < '10/14/2015' 
     ) 
+0

谢谢你,但我忘了一个条件,如果按说用户有2例,第一种情况是日期和日期后,在另一个之前创建的使用不应该被纳入在结果中。我将如何修改上面的查询? –

+0

“_不应该包含在result_中”是什么意思?我coudn't明白你很好,只是显示样品输入和预期放出来会更充分快速 –

+0

用户 了解用户1 用户2 用户3 案例 案例1 - 2015年9月14日 案例2 - 11 /二千零十五​​分之十四 情形3 - 2015年12月14日 CASE4 - 2015年8月15日 Users_Cases 用户1 - 案例1 用户1 - 案例2 用户2 - CASE3 用户3 - CASE4 预期的结果:只有用户3。用户1的情况<日期,但也有另一种情况> =日期,所以user1不包含在结果中。 –

1

可能这应该工作,因为我认为你要排除谁创造情况下,这些用户在指定的日期之后。

Select * from User as A 
    inner join UserCases as B on A.ID = B.UserID 
    inner join case as C on B.CaseID = C.ID 
Where C.Created <= @GivenDate 
    and A.ID not in (Select UserID from User_cases as D 
       inner join case as E on D.CaseID = E.ID 
       Where E.Created >= @GivenDate 
      ) 

如果您只想要一个ID,请使用group by子句。

Select A.ID from User as A 
    inner join UserCases as B on A.ID = B.UserID 
    inner join case as C on B.CaseID = C.ID 
Where C.Created <= @GivenDate 
    and A.ID not in (Select UserID from User_cases as D 
       inner join case as E on D.CaseID = E.ID 
       Where E.Created >= @GivenDate 
      ) 
group by A.ID 
0
SELECT U.* 
FROM `USER` AS U 
WHERE EXISTS (SELECT 1 FROM `Users_Cases` AS UC 
      INNER JOIN `case` AS C ON UC.CaseId=C.`id` 
      WHERE UC.UserId=U.`id` 
      AND C.`Created`<'2015-10-14' 
)