繁体   English   中英

选择NOT IN和多对多关系

[英]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 = 3user_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

http://sqlfiddle.com/#!2/b36b1/10

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM