我有这张桌子
用户:

id name
1 | tom
2 | jim
3 | bob

用户有玩具
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的用户
有人能帮我吗?

最佳答案

检查用户在另一个表中是否有多个特定行的一种方法是筛选这些行并查看计数是否正确。因此,例如,如果我们为特定的用户id计算User_Has_Toys中的行数,并为Toys 2和Toys 4进行筛选,那么只有当用户同时具有Toys 2和Toys 4时,我们才应该获得2的计数(注意:假设不允许重复的toy条目)。查询将如下所示:

 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分组并检查toy count是否正好为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

关于mysql - 通过refTabels查询,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7694144/

10-14 13:58