2011-10-08 44 views
1

我得到这个tabels查询通过refTabels

用户:

id name 
1 | tom 
2 | jim 
3 | bob 

User_Has_Toys

user_id toy_id 
1  | 2 
1  | 3 
1  | 4 
2  | 2 
2  | 4 
3  | 4 

玩具

id name 
1 | toy1 
2 | toy2 
3 | toy3 
4 | toy4 
5 | toy5 

我可以把查询

SELECT u.id FROM Users u 
LEFT JOIN User_Has_Toys uht ON (u.id = uht.user_id) 
LEFT JOIN Toy t ON t.id = uht.toy_id 
WHERE t.id IN ('2', '4') 

和我得到的所有用户 但我只需要用户ID为1和2

能有人帮帮我吗?

+0

应该... WHERE u.id = 2且u.id = 4代替t.id IN( '2', '4') – B4NZ41

+0

不,我需要得到用户必须有toy2和toy4 – fullpipe

+0

请更清楚。你的意思是“玩具2和玩具4”还是“玩具2或玩具4”?因为在你的例子中,你去了后者 –

回答

1

检查用户是否在另一个表中有多个特定行的一种方法是筛选这些行并查看count是否正确。因此,举例来说,如果我们计算User_Has_Toys中特定用户ID的行数并筛选玩具2和4,则当且仅当用户同时具有玩具2和4时,我们才能得到2的计数(注意:假设不允许重复的玩具条目)。查询会是这个样子:

SELECT 
    u.id 
FROM Users AS u 
    WHERE 2 = (
     SELECT COUNT(*) FROM User_Has_Toys uht 
     WHERE uht.toy_id IN (2,4) 
     AND uht.user_id = u.id); 

演示:http://sqlize.com/6yU3OlU2pD

你也可以用一个小的修改原始查询通过用户ID分组和检查玩具计数得到相同的结果恰好2:

SELECT u.id FROM Users u 
LEFT JOIN User_Has_Toys uht ON (u.id = uht.user_id) 
LEFT JOIN Toy t ON t.id = uht.toy_id 
WHERE t.id IN ('2', '4') 
group by u.id having count(t.id) = 2; 

演示:http://sqlize.com/7nTYZbJKsn

+0

其如此简单:) 真的是thantx。 – fullpipe

1
DECLARE @User TABLE 
(
UserID INT NOT NULL, 
Name VARCHAR(128) 
) 

DECLARE @User_Has_Toys TABLE 
(
    UserID INT NOT NULL, 
ToyID INT NOT NULL 
) 

DECLARE @Toys TABLE 
(
ToyID INT NOT NULL, 
ToyName VARCHAR(128) 
) 

INSERT INTO @User (UserID, Name) VALUES (1,'Tom') 
INSERT INTO @User (UserID, Name) VALUES (2,'Jim') 
INSERT INTO @User (UserID, Name) VALUES (3,'Bob') 

INSERT INTO @User_Has_Toys (UserID, ToyID) VALUES (1,2) 
INSERT INTO @User_Has_Toys (UserID, ToyID) VALUES (1,3) 
INSERT INTO @User_Has_Toys (UserID, ToyID) VALUES (1,4) 
INSERT INTO @User_Has_Toys (UserID, ToyID) VALUES (2,2) 
INSERT INTO @User_Has_Toys (UserID, ToyID) VALUES (2,4) 
INSERT INTO @User_Has_Toys (UserID, ToyID) VALUES (3,4) 

INSERT INTO @Toys (ToyID, ToyName) VALUES (1,'Toy1') 
INSERT INTO @Toys (ToyID, ToyName) VALUES (2,'Toy2') 
INSERT INTO @Toys (ToyID, ToyName) VALUES (3,'Toy3') 
INSERT INTO @Toys (ToyID, ToyName) VALUES (4,'Toy4') 
INSERT INTO @Toys (ToyID, ToyName) VALUES (5,'Toy5') 


SELECT 
u.UserID, 
u.Name, 
uht.ToyID, 
t.ToyName 
FROM @User AS u 
LEFT JOIN @User_Has_Toys AS uht ON u.UserID = uht.UserID 
LEFT JOIN @Toys AS t ON t.ToyID = uht.ToyID 
WHERE uht.ToyID IN (2,4) 

This one is good for SQL Server 2008 r2 
don't mind the temp tables I've just used them to represent you're sample table. 
+0

内部加入没有帮助 我认为问题出在'WHERE t.id IN('2','4')' – fullpipe

+0

当然id是整数并且是主要的 – fullpipe

+0

其做过不帮忙 – fullpipe