[英]Selecting with NOT IN and Many to Many relationship
我有很多关系
--------------------
| user_id | name |
--------------------
| 1 | user1 |
--------------------
| 2 | user2 |
--------------------
| 3 | user3 |
--------------------
--------------------
| type_id | name |
--------------------
| 1 | type1 |
--------------------
| 2 | type2 |
--------------------
| 3 | type3 |
--------------------
---------------------
| user_id | type_id |
---------------------
| 1 | 1 |
---------------------
| 1 | 2 |
---------------------
| 1 | 3 |
---------------------
| 2 | 1 |
---------------------
| 2 | 2 |
---------------------
| 3 | 3 |
---------------------
我正在尝试构造一个查询,以便如果我的用户是类型3,则根本不返回该用户。 到目前为止,我有一个查询排除了类型为3的用户,但如果还为其分配了其他类型,则会返回它们。
SELECT COUNT(DISTINCT `t`.`user_id`)
FROM `user` `t`
LEFT OUTER JOIN `type` `type_type` ON (`t`.`user_id`=`type_type`.`user_id`)
LEFT OUTER JOIN `type` `type` ON (`type`.`type_id`=`type_type`.`type_id`)
WHERE ((type.type_ids NOT IN (3));
上面的查询仍将返回user_id 1
因为该用户被分配到多个类型,如何分配类型3的用户,无论他们分配了多少其他类型?
试试这个where
子句:
where t.user_id not in (select user_id from usertypes where type_id = 3)
在MySQL中,以下可能更有效:
where not exists (select 1 from usertypes ut where ut.type_id = 3 and ut.user_id = t.user_id)
顺便说一句,“t”对于users
是一个糟糕的别名,特别是当你使用另一个名为types
表时。 “你”会是一个更好的别名。
您的IN()
子查询需要返回具有type_id = 3
的user_id
。
SELECT
COUNT(DISTINCT `t`.`user_id`)
FROM
`user` `t`
WHERE `user_id NOT IN (SELECT `user_id` FROM `type_type` WHERE `type_id` = 3)
也可以使用LEFT JOIN
对同一type_type
查询进行操作,在type_type
表中查找NULL
。
SELECT
COUNT(DISTINCT `t`.`user_id`)
FROM
`user` `t`
LEFT JOIN (
SELECT `user_id` FROM `type_type` WHERE `type_id` = 3
) user3 ON t.user_id = user3.user_id
WHERE user3.type_id IS NULL
http://sqlfiddle.com/#!2/b36b1/7
实际上连接的子查询甚至不是必需的。 它将使用普通的LEFT JOIN
。
SELECT
COUNT(DISTINCT `t`.`user_id`)
FROM
`user` `t`
LEFT JOIN type_type ON t.user_id = type_type.user_id AND type_type.type_id = 3
WHERE type_type.type_id IS NULL
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.