запрос через refTabels - PullRequest
       7

запрос через refTabels

1 голос
/ 08 октября 2011

я получил эти табели

Пользователи:

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

Может ли кто-нибудь мне помочь?

Ответы [ 2 ]

1 голос
/ 08 октября 2011

Один из способов проверить, есть ли у пользователя несколько определенных строк в другой таблице, состоит в том, чтобы отфильтровать эти строки и посмотреть, является ли счет правильным.Так, например, если мы посчитаем количество строк в User_Has_Toys для определенного идентификатора пользователя и фильтруем для игрушек 2 и 4, мы должны получить счет 2, если и только если у пользователя есть обе игрушки 2 и 4 ( ПРИМЕЧАНИЕ.: при условии, что повторяющиеся записи игрушек не допускаются ).Запрос будет выглядеть примерно так:

 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

Вы также можете получить тот же результат с незначительной модификацией исходного запроса, сгруппировав по идентификатору пользователя ипроверка того, что количество игрушек равно 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

1 голос
/ 08 октября 2011
 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. 
...